> {-# LANGUAGE TypeFamilies #-}
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.