[Haskell] GHC Error question

Norman Ramsey nr at eecs.harvard.edu
Tue Dec 5 16:20:40 EST 2006

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:

    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?


More information about the Haskell mailing list