
To elaborate on what Philippa said, the thing that probably is at the basis of your confusion is the fact that integer *literals* are overloaded (actually, the literal 3 means "fromInteger 3", where the result type of different fromInteger calls in the same expression need not be the same). So if you write 3, that can have any type belonging to the Num class, and in (1/3)^3 the two 3s are instantiated to different types, first, in (1/3), both literals are defaulted to Double, because by the use of (/), you need a type belonging to the Fractional class. Now (^) has type (^) :: (Integral b, Num a) => a -> b -> a, so the second 3 must have a type belonging to the Integral class, that is defaulted to Integer. Thus (1/3)^3 is in fact interpreted as ((1 :: Double) / (3 :: Double)) ^ (3 :: Integer). In the lambda expression (\k -> (1/k)^k), k is one value, belonging to one type t. The occurence of k in (1/k) demands that t belong to Fractional and the second occurence of k, ^k, demands that t belong to Integral. None of the standard types belongs to both these classes. And in (\k -> (1/k)^k) 3 fromInteger 3 must have type (Fractional t, Integral t) => t. HTH, Daniel Am Dienstag, 26. Februar 2008 01:01 schrieb Ben:
I'm just starting to learn Haskell, and I'm having some confusion (I think) with how the type inference is working. Can someone explain why, in ghc 6.8.2 this works:
*Main> (1/3)^3 3.7037037037037035e-2
But this doesn't
*Main> (\k -> (1/k) ^ k) 3
<interactive>:1:8: Ambiguous type variable `t' in the constraints: `Fractional t' arising from a use of `/' at <interactive>:1:8-10 `Integral t' arising from a use of `^' at <interactive>:1:7-15 Probable fix: add a type signature that fixes these type variable(s)
TIA, Ben