[Haskell] Implicit type of numeric constants
R.J.Stroud at ncl.ac.uk
Wed Sep 20 07:39:35 EDT 2006
I'm a newcomer to Haskell and I've been typing some simple
expressions into Hugs in an attempt to understand how the built-in
numeric types work . However, I'm puzzled by the following example:
k = 2
f :: Int -> Int -> Int
f x y = x * y
After loading a file containing this code into Hugs, if I type "f 2
2" I get the value 4 as expected, but if I type "f k k" I get a type
error because the type of k is inferred to be Integer.
This seems like a violation of referential transparency to me - I
would expect the inferred type of k to be the same as the type of 2.
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?
For that matter, if the type of 2 is "Num a => a", which I understand
to mean "an arbitrary numeric type", why is it OK to pass 2 to a
function that expects an Int?
More information about the Haskell