#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