[Haskell] Re: Implicit type of numeric constants

Christian Sievers sievers at math2.nat.tu-bs.de
Thu Sep 21 13:54:52 EDT 2006

Robert Stroud wrote:

> 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?

2 has the fixed polymorphic type  Num a => a, which gets resolved
at each occurance.  This resolving happens at compile time, so there
is no repeated computation at run time involved.  However, you need
to somehow get both a 2::Int and a 2::Double which may be seen as a
trivial case of this repeated computation.

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

Only if you expect referential transparency for implicitly typed values.
All you have to do is say

  k :: Num a => a
  k = 2

and everything is fine.

Christian Sievers

More information about the Haskell mailing list