[Haskell-beginners] Is this MR? Type restriction confusion

Mike Erickson mike.erickson at gmail.com
Thu Dec 17 19:46:34 EST 2009


On Thu, Dec 17, 2009 at 3:45 PM, Daniel Fischer
<daniel.is.fischer at web.de> wrote:
> Am Donnerstag 17 Dezember 2009 23:56:13 schrieb Mike Erickson:
>> I was trying to convert a function,
>>
>> f1 x l = map (\y -> y*x) l
>>
>> to so-called point-free style, but in reducing it I found two
>> functions that seemed to work the same, until I discovered they have
>> different types, and aren't equivalent:
>>
>> f1a x = map (*x) -- has type (Num a) => a -> [a] -> [a]
>>
>> f1b = \x -> map (*x) -- has type Integer -> [Integer] -> [Integer]
>>
>> Can someone help me understand why the latter has a more restrictive type?
>
> Indeed it's the monomorphism restriction.
> [...]

This was very helpful. I think I understand, although it's still digesting.

> In short, if you declare a function point-free and the inferred type involves type
> classes, it cannot be polymorphic unless you give a type signature. Without a type
> signature, the implementation tries to determine a monomorphic type from the inferred
> polymorphic type by the defaulting rules
> (http://haskell.org/onlinereport/decls.html#sect4.3.4). If that succeeds, this type is
> given to the function, otherwise it's a type error and the module doesn't compile.

Shortly after posting (of course) I discovered the online report and
4.5.4 and 4.5.5 were helpful as well.

Thanks to all that responded,

Mike


More information about the Beginners mailing list