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 _______________________________________________ Glasgow-haskell-users mailing list [email protected] http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
