
Rene de Visser wrote:
There may be a heuristic that would help more programs to go through... but I prefer asking the programmer to make the desired behaviour explicit.
Simon
How can the user make this explicit?
With the
class C a b where op :: a -> a instance C Int Int where op a = -a
test d = op d
example,
I have been unable to figure out what type annotations I need to add to 'test', for exampl,e to define test to be for the C Int Int instance.
Or is it simply impossible in GHC to give test a type signature and to use it as a useful function?
Example
I can't quite do that but I have a trick: In GHC 6.6 with -fglasgow-exts this works:
module Foo where
data CInst a b
class C a b where cInst :: CInst a b cInst = undefined op :: a -> a op' :: CInst a b -> a -> a
instance C Int Int where op a = -a op' _ a = (-a)
intInst :: CInst Int Int intInst = cInst
test x = (op' intInst) x
And test is inferred to have type:
*Foo> :i test test :: Int -> Int -- Defined at /tmp/test.hs:18:0
Essentially the trick used in this case is to reify the instance (C Int Int) as the value (undefined :: CInst Int Int). Then you can specify to "op" -- Chris