[Haskell] question about a failure to generalize

Norman Ramsey nr at eecs.harvard.edu
Sat Sep 15 16:50:57 EDT 2007

Dear Haskellers,

I've had a Haskell program rejected for reasons I don't understand.
Here's the relevant bit of code; the problem is that I expected the
type-inference engine to generalize the abbreviation 'fold' to an
overloaded function, but it doesn't---to make the code work, I had to
expand 'fold' into 'foldRegsUsed' everywhere it appears.  I'm baffled
because 'fold' isn't mutually recursive with anything, so I would have
expected ordinary Hindley-Milner style inference to generalize it to
something of the type

  UserOfLocalRegs a => (b -> LocalReg -> b) -> b -> a -> b

But that's not what happens.  This code fails to compile because the
compiler is willing to use 'fold' at only one type (CmmExpr as it happens):

  class UserOfLocalRegs a where
    foldRegsUsed :: (b -> LocalReg -> b) -> b -> a -> b

  instance UserOfLocalRegs Middle where
      foldRegsUsed f z m = middle m
        where middle (MidComment {})                = z
              middle (MidAssign _lhs expr)          = fold f z expr
              middle (MidStore addr rval)           = fold f (fold f z addr) rval
              middle (MidUnsafeCall tgt _ress args) = fold f (fold f z tgt) args
              middle (CopyIn _ _formals _)          = z
              middle (CopyOut _ actuals)            = fold f z actuals
              fold = foldRegsUsed

What rule of the language have I overlooked?


More information about the Haskell mailing list