Integral
Integral
is the class of all integral number types. Instances include Int
,
Integer
, and a whole long list of integral number types defined in
Data.Word
. While Integral
is a subclass of Num
—integers are numbers after
all—it is not a direct subclass of Num
:
type Integral :: * -> Constraint
class (Real a, Enum a) => Integral a where
quot :: a -> a -> a
rem :: a -> a -> a
div :: a -> a -> a
mod :: a -> a -> a
quotRem :: a -> a -> (a, a)
divMod :: a -> a -> (a, a)
toInteger :: a -> Integer
{-# MINIMAL quotRem, toInteger #-}
-- Defined in ‘GHC.Real’
[More omitted output]
This says that integral number types need to support the expected integral
division operations div
and quot
, along with the corresponding remainder
operations mod
and rem
, as well as the combinations of division and
remainder divMod
and quotRem
. An integral type, being an integer, should
also be convertible back to an Integer
, using toInteger
.
Now, as I just said, Num
is not a direct superclass of Integral
: it does
not occur in the list of superclasses of Integral
at all. The immediate
superclasses of Integral
are Real
and Enum
. Real
is a direct subclass
of Num
, so that's how Integral
is a class of number types.