На этом шаге мы приведем иерархию классов и дадим краткую характеристику каждого класса.
Что такое "класс"?
Приведём иерархию классов, определённых в стандартном модуле Prelude.hs (по [1, с.183, 192-206]):
Рис.1. Иерархия классов
Операции класса Eq a:
(==), (/=) :: a -> a -> Bool
Операции класса Show a:
show :: a -> String showsPrec :: Int -> a -> ShowS showList :: [a] -> ShowS
Таким образом, может быть определён порядок следования элементов такого типа.
Операции класса Enum a:
succ, pred :: a -> a toEnum :: Int -> a fromEnum :: a -> Int enumFrom :: a -> [a] -- [n..] enumFromThen :: a -> a -> [a] -- [n,m..] enumFromTo :: a -> a -> [a] -- [n..m] enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m]
Операции класса Ord a:
compare :: a -> a -> Ordering (<), (<=), (>=), (>) :: a -> a -> Bool max, min :: a -> a -> a
Ordering ↔ {EQ,LT,GT},
Операции класса Num a:
(+), (-), (*) :: a -> a -> a negate :: a -> a abs, signum :: a -> a fromInteger :: Integer -> a fromInt :: Int -> a
Операции класса Ix a:
range :: (a,a) -> [a] index, unsafeIndex :: (a,a) -> a -> Int inRange :: (a,a) -> a -> Bool rangeSize :: (a,a) -> Int
Операции класса Real a:
toRational :: a -> Rational
Все такие типы должны иметь определённую операцию деления.
Кроме того, каждый элемент должен иметь обратное значение относительно операции деления.
Далее, все значения этого класса должны иметь возможность преобразования из рациональных чисел.
Операции класса Fractional a:
(/) :: a -> a -> a recip :: a -> a fromRational :: Rational -> a fromDouble :: Double -> a
Операции класса Intgral a:
quot, rem, div, mod :: a -> a -> a quotRem, divMod :: a -> a -> (a,a) toInteger :: a -> Integer toInt :: a -> Int
Операции класса RealFrac a:
properFraction :: (Integral b) => a -> (b,a) truncate, round :: (Integral b) => a -> b ceiling, floor :: (Integral b) => a -> b
Операции класса Floating a:
pi :: a exp, log, sqrt :: a -> a (**), logBase :: a -> a -> a sin, cos, tan :: a -> a asin, acos, atan :: a -> a sinh, cosh, tanh :: a -> a asinh, acosh, atanh :: a -> a
Операции класса RealFloat a:
floatRadix :: a -> Integer floatDigits :: a -> Int floatRange :: a -> (Int,Int) decodeFloat :: a -> (Integer,Int) encodeFloat :: Integer -> Int -> a exponent :: a -> Int significand :: a -> a scaleFloat :: Int -> a -> a isNaN, isInfinite, isDenormalized, isNegativeZero, isIEEE :: a -> Bool atan2 :: a -> a -> a
Операции класса Read a:
readsPrec :: Int -> ReadS a readList :: ReadS [a]
Однако само множество вполне может быть и неупорядоченным - в нём может отсутствовать отношение порядка.
Операции класса Bounded a:
minBound, maxBound :: a
На следующем шаге мы рассмотрим создание экземпляров классов.