
Hi! That's very weird, I don't have a good answer (and fortunately there are far smarter people on this list who will have a better answer...) but my instincts say it has to do with defaulting. When GHC sees a literal digit, it tries to guess what it's type should be, first via inference, but if that returns a polymorphic type (like `Num a => a` or something) it will "default" to a particular type, for literal whole positive/negative numbers, it defaults to `Integer`. My guess is that, defining in GHCi
let f x = x * 2 let g = \x -> x * 2
the former doesn't default to anything (it just does inference) since it's a function definition, and the latter defaults the '2' to an Integer because it's a value -- or some suitable analog of that situation. What will really blow your mind, try having GHCi inspect the type of
:t \x -> x * 2
(the defn. of `g` w/o the let...) Short answer, I have no idea, but I think it has to do with defaulting. /Joe On Nov 12, 2009, at 3:37 AM, Dag Hovland wrote:
Hi!
I have a problem with understanding some types given by ghc and hugs. The file loaded is:
f1 = \x -> x * 2 f2 x = x * 2
After they are loaded I get the following from ghci
*Main> :t f1 f1 :: Integer -> Integer *Main> :t f2 f2 :: (Num a) => a -> a *Main> :t \x -> x * 2 \x -> x * 2 :: (Num a) => a -> a
I do not understand why f1 is given Integer -> Integer as a type and not the polymorphic (Num a) => a -> a. I believed that f1, f2 and the lambda expression should all have the same type. Similar output to that above is given by Hugs.
Thanks,
Dag Hovland _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners