
[redirecting to ghc users] It looks like a splendid error to me. The call of compile1 is obliged to pass to compile1 a dictionary of type (Builder b box), *for any type box*. There are no further constraints on box, so compile1 can make no assumptions about how the caller chooses to instantiate 'box'. But in the body you'll need a dictionary of type (Builder b box1), but there is nothing to ensure that the caller chooses the "right" box. Maybe you want the Builder class to have a functional dependency (b -> box), so that fixing b fixes box. I can't say more without seeing the code. can you give a small repo case? Simon | -----Original Message----- | From: haskell-bounces@haskell.org [mailto:haskell-bounces@haskell.org] On Behalf Of Norman | Ramsey | Sent: 05 December 2006 21:21 | To: haskell@haskell.org | Cc: nr@eecs.harvard.edu | Subject: [Haskell] GHC Error question | | Without going too deep into the details of my type classes, I have | written the following code (focusing on compile1): | | {-# OPTIONS -fglasgow-exts #-} | | compile1 :: (Builder b box) => t -> Name -> Ir.ANF -> b t | compile1 f x body = do env <- compile body empty | wire (Arg W) (env x) | return f | | compile :: (Builder b box) => Ir.ANF -> Env box -> b (Env box) | | class (Monad b) => Builder b box where | wire :: Source box -> Sink box -> b () | ... | | type Env box = Name -> Sink box | | This program is rejected by GHC with the following message: | | Ccomp.hs:54:23: | Could not deduce (Builder b box1) from the context (Builder b box) | arising from use of `wire' at Ccomp.hs:54:23-42 | Possible fix: | add (Builder b box1) to the type signature(s) for `compile1' | In the expression: wire (Arg W) (env x) | In a 'do' expression: wire (Arg W) (env x) | In the expression: | do env <- compile body empty | wire (Arg W) (env x) | return f | | Note that compile1 has an explicit type signature much along the lines | suggested by GHC. If I *remove* this type signature, the function | compiles successfully, and ghci reporets this type for compile1: | | compile1 :: (Builder t box) => t1 -> Name -> Ir.ANF -> t t1 | | I believe this signature is isomorphic to the explicit signature I had | attempted to use. | | Am I misusing the type-class system in some way, or should I be | reporting a bug in GHC? | | | Norman | | _______________________________________________ | Haskell mailing list | Haskell@haskell.org | http://www.haskell.org/mailman/listinfo/haskell