Num
I've mentioned Num
as the class of number types before. Here is its definition:
type Num :: * -> Constraint
class Num a where
(+) :: a -> a -> a
(-) :: a -> a -> a
(*) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
{-# MINIMAL (+), (*), abs, signum, fromInteger, (negate | (-)) #-}
-- Defined in ‘GHC.Num’
[More omitted output]
To be an instance of Num
, a type a
needs to support addition, subtraction,
multiplication, negation, taking the absolute value or sign, and conversion from
the Integer
type to the type a
. This last condition is necessary because we
want to be able to use number literals, such as 0, 1 or 523, for any type a
that is a number type. The Haskell compiler parses these literals as Integer
s,
and fromInteger
allows us to convert these Integer
s into any number type a
.
Note the omission of division from the list of arithmetic operations that a
number type must support. That's a consequence of Haskell having two different
division operations for integral types, div
, and for fractional types, (/)
.
Since a number type can be an integral type or a fractional type, we cannot
require every number type to implement div
or (/)
. For that, we need
subclasses of Num
, discussed next.