Can't infer type (type family + "element" type)
simonpj at microsoft.com
Tue Jan 19 05:15:51 EST 2010
Looks like a bug to me! I am currently elbows-deep in re-engineering GHC's entire constraint generation and solving mechanism, which will, I hope, simply solve your problem.
But meanwhile can I ask a favour: submit a Trac report with the offending code in reproducible form? Then I'll be sure to test the new code against all such tickets.
| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org [mailto:glasgow-haskell-users-
| bounces at haskell.org] On Behalf Of Sean Leather
| Sent: 18 January 2010 16:59
| To: GHC Users List
| Subject: Can't infer type (type family + "element" type)
| 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.
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
More information about the Glasgow-haskell-users