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,,,
