#3826: Can't infer type (type family as "element" type)
---------------------------------+------------------------------------------
    Reporter:  spl               |       Owner:                           
        Type:  bug               |      Status:  new                      
    Priority:  normal            |   Component:  Compiler (Type checker)  
     Version:  6.12.1            |    Keywords:  type families            
          Os:  Unknown/Multiple  |    Testcase:                           
Architecture:  Unknown/Multiple  |     Failure:  GHC rejects valid program
---------------------------------+------------------------------------------
 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.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3826>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to