Not logged in. Login

Haskell Type Classes: Constrained Parametric Polymorphism

Haskell's type class system is a powerful mechanism to support systematic polymorphism.

The Num Class

For example, Haskell's Num class is the class of all numeric types. It allows polymorphic functions such as (+) to be defined for all numeric types.

(+) :: (Num a) => a -> a -> a

Here (Num a) => is a type context, stating that a is an instance of type clase Num, i.e., a numeric type.

Three important instances of type class Num are

  1. Int - fixed precision integers based on machine register size (typically 32-bit or 64-bit).
  2. Integer - arbitrary precision integers.
  3. Float - single-precision floating point numbers.

Numeric literals such as 17 and 5.21 are also polymorphic.

Prelude> :type 17
17 :: Num a => a
Prelude> :type 5.21
5.21 :: Fractional a => a

Fractional is a subclass of Num that excludes Int and Integer. Depending on context, type inference narrows types to ones which support given operations.

Prelude> :type 17 + 5.21
17 + 5.21 :: Fractional a => a
Prelude> 17 + 5.21
22.21

In the example, 17 is first narrowed from Num to Fractional to match the polymorphic Fractional type.

Updated Mon Oct. 12 2015, 20:13 by cameron.