On 21 Sep 2006, at 10:46, Robert Stroud wrote:

So k gets a monotype which is determined by its usage, you cannot do e.g.

  let k = 2 ; f :: Int -> Int -> Int ; f x y = x * y in (f k k, 1/k)

whereas   let k :: Num a => a; k = 2; ...   is possible.

Thanks - that's a helpful example. But why is the following not equivalent to the untyped "k = 2" case:

let f :: Int -> Int -> Int ; f x y = x * y in (f 2 2, 1/2)

Does the type of 2 effectively get decided twice, once as an Int, and once as a Fractional, and is this the "repeated computation" that the monomorphism restriction is intended to prevent?

Otherwise, I would have expected that it wouldn't make any difference whether I used a named 2 or an anonymous 2, but imposing the monomorphism restriction on the named 2 seems to break referential transparency.

Aha - light begins to dawn... :-)

Each 2 is a different 2, so the type of 2 can be different each time it's used, whereas there's only one k so it can only have one type.

Is that right?

Robert

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to