Numbers in GHC Prelude

2018-05-12
haskellnumeric

When using number literals in GHC, it is easy to run into type errors because of the various numeric types that exist in GHC. Prelude has six different number types.

Number Types

  • Int:
    • a fixed-precision integer type with at least the range [-2^29 .. 2^29-1]
    • numeric type class instances: Integral, Num, Real
  • Integer
    • arbitrary precision integer like bignum or bigint in other languages
    • numeric type class instances: Integral, Num, Real
  • Float
    • single-precision floating point numbers
    • numeric type class instances: Floating, Fractional, Num, Real, RealFloat, RealFrac
  • Double
    • double-precision floating point numbers
    • numeric type class instances: Floating, Fractional, Num, Real, RealFloat, RealFrac
  • Rational
    • arbitrary precision rational number
    • type synonym for Ratio Integer
    • numeric type class instances: Integral, Num, Real
  • Word
    • unsigned number with the same size as Int
    • numeric type class instances: Integral, Num, Real

Number Type Classes

The common arithmetic operators shared between the various number types come from type classes in Prelude. Most of the binary operators require that both parameters be of the same type (a -> a -> a). If any of the parameters are of a different type, they must be manually converted to match the other type.

Num

The basic type class implemented by all of the Prelude number types.

  • basic arithmetic except for division: (+), (-), (*)

  • sign related functions: negate, abs, signum

  • fromInteger: convert from Integer to another Num type

signum returns -1 for negative, 0 for zero and 1 for positive.

Real

  • toRational: convert a number type into Rational (Ratio Integer)

Integral

Provide integer division for integral (whole) numbers.

  • quot: integer division with truncation towards zero.
    • quot 15 7 is 2
    • quot (-15) 7 is -2
  • div: integer division with truncation towards negative infinity.
    • div 15 7 is 2
    • div (-15) 7 is -3
  • rem
    • rem 7 3 is 1
    • rem 7 (-3) is 1
    • rem (-7) 3 is -1
    • rem (-7) (-3)is -1
  • mod
    • mod 7 3 is 1
    • mod 7 (-3) is -2
    • mod (-7) 3 is 2
    • mod (-7) (-3)is -1
  • two operations returned as a tuple: quotRem, divMod

  • toInteger: convert a numeric type to Integer

Fractional

Support real division.

  • (/): real division
  • fromRational: convert Rational (Ratio Integer) to another number type

Floating

Trigonometric and hyperbolic functions.

  • pi
  • exp
  • log
  • sqrt
  • (**)
  • logBase
  • sin, cos, tan
  • asin, acos, atan
  • sinh, cosh, tanh
  • asinh, acosh, atanh

RealFrac

  • truncate: round towards the nearest integer in the direction of zero

  • round: round towards the nearest integer

  • ceiling: round up

  • floor: round down

RealFloat

A collection of functions related to the components of floating-point numbers: Prelude.RealFloat.

Numeric Functions

These functions are not part of a type classes, but they all have type class requirements.

  • Num requirement: subtract,

  • Integral requirement: even, odd, gcd, lcm

  • Num to Integral: (^) raise to a non-negative power

  • Fractional to Num: (^^) raise to a negative power

Other Numeric Modules in GHC base