On Saturday, April 16, 2016 at 5:49:24 PM UTC+2, Roman Cheplyaka wrote:
On 04/16/2016 02:53 PM, Alexey Muranov wrote:
> Sorry for the question that probably is already answered somewhere, but i do not get it from the basic documentation i have looked at so far.
>
> Is monomorphism restriction really necessary, or is it just a convenience?
>
> In the example from A History of Haskell
>
>     genericLength :: Num a => [b] -> a
>
>     f xs = (len, len)
>         where
>             len = genericLength xs
>
> can't the monomorphism restriction be replaced with just adding the signature
>
>     f :: Num a => [b] -> (a, a)
>
> ?

No; the let binding 'len' would still generalize. It would generalize
even if you assigned 'f' a monotype such as [b] -> (Int, Int).

Now, the compiler *could* later realize that the polymorphic value 'len'
is evaluated twice at the same type and perform a CSE, but I guess the
standard authors were not comfortable with *requiring* that kind of
optimization from all compliant compilers.

Of course, nowadays we have scoped type variables, so MR is no longer
strictly necessary. Sometimes it is desirable in that it gives the
behavior that you would intuitively expect; sometimes, the opposite.

Roman
  
Thank you, i will think about it, though i don't understand yet.

Could you show me, please, how to use scoped type variables to avoid MR in this example?

Alexey.