Re: [Haskell-cafe] Re: [Haskell] question about a failure to generalize

2007-09-15 Thread Neil Mitchell
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
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Re: [Haskell] question about a failure to generalize

2007-09-15 Thread Tim Chevalier
[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