Can't infer type (type family + "element" type)

Sean Leather leather at
Mon Jan 18 11:58:50 EST 2010

Suppose I have a class C,

> class C a where
>   type E a
>   c :: E a -> a -> a

a datatype T,

> data T a = T a

and an instance of C for T

> instance C (T a) where
>   type E (T a) = a
>   c x (T _) = T x

I would like to write a function such as f

> f t@(T x) = c x t

without a type signature. Unfortunately, I can't because GHC tells me

    Couldn't match expected type `t' against inferred type `T (E t)'
    In the second argument of `c', namely `t'
    In the expression: c x t
    In the definition of `f': f (t@(T x)) = c x t

There are at least three possible ways to write the above code such
that it works.

(1) Give a type signature for f

> f :: T a -> T a

(2) Define the class C using an equality constraint

> class C t where
>   type E t
>   c :: (E t ~ e) => e -> t -> t

(3) Define the class C using functional dependencies

> class C t e | t -> e where
>   c :: e -> t -> t

But the real question is why don't I get a type for f?

This has been tested in GHC 6.10.1 and 6.12.1.


More information about the Glasgow-haskell-users mailing list