[Haskell] Re: Implicit type of numeric constants

Christian Sievers sievers at math2.nat.tu-bs.de
Wed Sep 20 12:28:31 EDT 2006

Arie Peterson 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.

Defaulting in Haskell 98 happens so late that this file

  k = 2
  f :: Int -> Int -> Int
  f x y = x * y
  r = f k k

is okay.  Alas, Hugs does not comply in this respect, see
at the end of 5.1.3.

All the best,
Christian Sievers

More information about the Haskell mailing list