On 20 Sep 2006, at 17:28, Christian Sievers wrote:

However, if I type an apparently equivalent let expression into Hugs
directly, then I get the value 4 as expected

let k = 2 ; f :: Int -> Int -> Int ; f x y = x * y in f k k

Why is there a difference in behaviour?

Here, there is no defaulting, 'k' has the polymorphic type you expect, and the use of 'k' as an argument to the monomorphically typed 'f' chooses the
right instance of 'Num'.

Well, there is no defaulting at the stage of type checking when k is given type Num a => a, the monomorphism restriction applies and this type is not generalised to forall a . (Num a) => a, then the use of k forces the type variable a to be Int, and then there is no longer any need for defaulting.

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.

Thanks.

Robert


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

Reply via email to