Re: [Haskell] question about a failure to generalize

[replying to haskell-cafe]
On 9/15/07, Norman Ramsey
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?
Monomorphism restriction? Replacing fold with foldRegsUsed would work because there's a type signature for foldRegsUsed. Cheers, Tim -- Tim Chevalier * catamorphism.org * Often in error, never in doubt "...There is no mystery; there is only paradox, the incontrovertible union of contradictory truths." -- Edward Abbey

Hi
Monomorphism restriction? Replacing fold with foldRegsUsed would work because there's a type signature for foldRegsUsed.
That looks like it. Another solution would be:
fold = foldRegsUsed
becomes:
fold x = foldRegsUsed x
Now the monomorphism restriction doesn't kick in because fold has an explicit argument. Thanks Neil
participants (2)
-
Neil Mitchell
-
Tim Chevalier