[replying to haskell-cafe] On 9/15/07, Norman Ramsey <[EMAIL PROTECTED]> wrote: > 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 _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe