Hello, 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? Thank you. Robert Stroud