On Sunday 03 July 2011, 09:19:11, dm-list-haskell-c...@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. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe