
Done: http://hackage.haskell.org/trac/ghc/ticket/3826
Regards,
Sean
On Tue, Jan 19, 2010 at 11:15, Simon Peyton-Jones
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.
Thanks
Simon
| -----Original Message----- | From: glasgow-haskell-users-bounces@haskell.org [mailto: glasgow-haskell-users- | bounces@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. | | Thanks, | Sean | _______________________________________________ | Glasgow-haskell-users mailing list | Glasgow-haskell-users@haskell.org | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users