[Haskell-cafe] Strange context reduction with partial application and casting

Daniel Fischer daniel.is.fischer at googlemail.com
Sun Jul 3 11:05:57 CEST 2011


On Sunday 03 July 2011, 09:19:11, dm-list-haskell-cafe at scs.stanford.edu 
wrote:
> At Sat, 2 Jul 2011 17:23:50 -0400,
> 
> Brent Yorgey wrote:
> > On Sat, Jul 02, 2011 at 09:02:13PM +0200, Daniel Fischer wrote:
> > > - disabling the monomorphism restriction
> > > 
> > > :set -XNoMonomorphismRestriction
> > > 
> > > let g = f
> > 
> > This is the recommended solution.  The confusion caused by the MR far
> > outweighs its occasional benefits.
> 
> Recommended by some people, but by no means everyone.
> 
> For instance, Vytiniotis, Peyton Jones, and Schrijvers make a good
> argument that the monomorphism restriction should effectively be
> expanded to include both pattern and function bindings in let and
> where clauses:
> 
> 	http://research.microsoft.com/pubs/102483/tldi10-vytiniotis.pdf
> 
> The above paper is currently implemented in GHC, and on by default if
> you enable GADTs.  (So you would additionally need
> -XNoMonoLocalBindings if you wanted to use GADTs.)  Moreover, even

It's [No]MonoLocalBinds, which is shorter - but apparently the participle 
is more intuitive. [However, I'm not advocating a change]

> with -XNoMonoLocalBindings, you still run into the fact that bindings
> are not generalized within a declaration group, which could lead to
> confusion.  In particular, consider the following program:
> 
> 	{-# LANGUAGE NoMonomorphismRestriction #-}
> 	x = 2                 -- The type of x is:  Num a => a
> 	y = (x + y) :: Int
> 
> The type of x is what you would expect without the monomorphism
> restriction.  Now say x has a gratuitous use of y:
> 
> 	{-# LANGUAGE NoMonomorphismRestriction #-}
> 	x = 2 where _ = y     -- The type of x is:  Int
> 	y = (x + y) :: Int
> 
> If you want x to be polymorphic in this case, you have to give it a
> type signature anyway:
> 
> 	{-# LANGUAGE NoMonomorphismRestriction #-}
> 	x :: Num a => a
> 	x = 2 where _ = y
> 	y = (x + y) :: Int
> 
> Thus, what I would recommend, instead of -XNoMonoLocalBindings, is to

You meant NoMonomorphismRestriction here, I think.

> give type signatures to your polymorphic bindings.  This makes the

+1

> code more readable.  It has the disadvantage that Haskell doesn't
> allow you to name monomorphic type variables, which, for local
> bindings, can require either the use of -XScopedTypeVariables or
> giving extra function arguments whose only purpose is to bring a type
> variable into scope.  But both of those are probably more future-proof
> than -XNoMonomorphismRestriction.

But as I understand it, the concern is ghci, where truly local bindings are 
probably rare and type signatures are commonly omitted.
So putting ":s -XNoMonomorphismRestriction" in the .ghci file probably 
prevents more confusion and inconvenience than it causes.





More information about the Haskell-Cafe mailing list