| bar :: (C T) => T
| *Main> :t bar
| | <interactive>:1:0:
|     No instance for (C T)
|       arising from a use of `bar' at <interactive>:1:0-2
|     Possible fix: add an instance declaration for (C T)
|     In the expression: bar

I'm not sure where that comes from, but it does seem to be an artifact of GHC's type inference, which seems unwilling to infer
a flexible context even if flexible contexts are enabled:

*Main> :show languages
active language flags:
 -XImplicitPrelude
 -XFlexibleContexts
*Main> let f _ = negate []
*Main> :t f
f :: (Num [a]) => t -> [a]
*Main> let f _ = negate [()]

<interactive>:1:10:
   No instance for (Num [()])
     arising from a use of `negate' at <interactive>:1:10-20
   Possible fix: add an instance declaration for (Num [()])
   In the expression: negate [()]
   In the definition of `f': f _ = negate [()]
*Main> let f :: Num [()] => t -> [()]; f _ = negate [()]
*Main> :t f

<interactive>:1:0:
   No instance for (Num [()])
     arising from a use of `f' at <interactive>:1:0
   Possible fix: add an instance declaration for (Num [()])
   In the expression: f

This does look like a bug to me? Compare with Hugs (Hugs mode):

Main> :t let f _ = negate [] in f
let {...} in f :: Num [a] => b -> [a]
Main> :t let f _ = negate [()] in f
let {...} in f :: Num [()] => a -> [()]

Claus


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to