λ> :t 1
1 :: Num t => t
λ> :t pi
pi :: Floating a => a
In the examples above, the type-checker infers a type-class rather than a concrete type for the two constants. In Haskell, the Num
class is the most general numerical one (since it encompasses integers and reals), but pi
must belong to a more specialized class, since it has a nonzero fractional part.
list0 :: [Integer]
list0 = [1, 2, 3]
list1 :: [Double]
list1 = [1, 2, pi]
The concrete types above were inferred by GHC. More general types like list0 :: Num a => [a]
would have worked, but would have also been harder to preserve (e.g. if one consed a Double
onto a list of Num
s), due to the caveats shown above.