id summary reporter owner description type status priority milestone component version resolution keywords cc os architecture failure testcase blockedby blocking related differential wikipage
3826 "Can't infer type (type family as ""element"" type)" spl simonpj "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." bug closed normal 7.0.1 Compiler (Type checker) 6.12.1 fixed type families leather@… Unknown/Multiple Unknown/Multiple GHC rejects valid program indexed-types/should_compile/T3826