id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
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			
