[Haskell] GHC Error question

Simon Peyton-Jones simonpj at microsoft.com
Tue Dec 5 18:12:26 EST 2006


[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 at haskell.org [mailto:haskell-bounces at haskell.org] On Behalf Of Norman
| Ramsey
| Sent: 05 December 2006 21:21
| To: haskell at haskell.org
| Cc: nr at 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 at haskell.org
| http://www.haskell.org/mailman/listinfo/haskell


More information about the Glasgow-haskell-users mailing list