
One problem in *Programming Haskell from First Principles* confuses me. (So far.) It's one where you start with the declaration and binding i :: Num a => a i = 1 (which of course works because Num a => a is the type of 1) and then change the declaration to i :: a and first try to predict and then see what happens. It fails, with ghci suggesting that you put the Num a => back. That seemed reasonable at first, but then I considered this: - id has type a -> a, and if you try to evaluate id 1 it works without complaint. - In all the work I've done on compilers, parameter passing has effectively been assignment of actual parameters to the corresponding formal parameters. In Haskell, that might mean passing along the appropriate thunk, but the principle is the same, isn't it? So, if I can't bind 1 to i which is declared to have type a, why can I successfully pass 1 to id?