
Alexey Rodriguez:
We are having trouble with the following program that uses type families:
class Blah f a where blah :: a -> T f f a
class A f where type T f :: (* -> *) -> * -> *
the following function does not type:
wrapper :: forall a f . Blah f a => a -> T f f a wrapper x = blah x
GHC gives the error:
Couldn't match expected type `T f1 f1 a' against inferred type `T f f a' In the expression: blah x In the definition of `wrapper': wrapper x = blah x
Maybe it is a problem with ambiguous types, namely "f" appears only in applications of "T". But that is not the case, there is a "naked" f appearing as the argument of "T f". But perhaps the type checker does not want to unify those two f's precisely because they are the arguments of "T f".
The problem is that blah's type is ambiguous, as f does only occur as an argument to the type family. If you'd define class Blah f a where blah :: a -> f -> T f f a (and change the rest of the program accordingly) then all will be fine. See this thread for a more in-depth discussion of the problem: http://www.haskell.org/pipermail/haskell-cafe/2008-April/041385.html Manuel