The Integral
constraint comes from the exponent of 2
. Remember that in Haskell, integer literals are actually polymorphic values of type Num a => a
. The compiler then infers that since it's being used as an exponent to (^) :: (Num a, Integral b) => a -> b -> a
, it must be of the more constrained type Integral a => a
.
To save you from having to disambiguate numeric literals all over your code, Haskell uses type defaulting to pick a reasonable concrete type for any unconstrained numeric types. In this case, that will be Integer
. The difference seems to be that :type
in Hugs reports the inferred type before this happens, while GHCi reports the type after type defaulting has been applied.
If you specify a concrete type for the exponent yourself, the extra constraint disappears.
Hugs> :type (\x -> x^(2 :: Integer))
\x -> x ^ 2 :: Num a => a -> a
Functor
andMonad
. Before that (we're talking Haskell 1.3 here) typeclasses could only be declared for kinds*
. There was a lot going on, back around 1992. On the other hand, it's still a lot of fun now: GADTs, type families and constraint kinds, oh my! – Krol