52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 32

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 32

(>=) :: a -> a -> Bool

(> ) :: a -> a -> Bool

(<=) :: a -> a -> Bool

max :: a -> a -> a

min :: a -> a -> a

Автоматический вывод экземпляров классов типов | 31

Тип Ordering кодирует результаты сравнения:

Prelude> :i Ordering

data Ordering = LT | EQ | GT

-- Defined in GHC.Ordering

Он содержит конструкторы, соответствующие таким понятиям как меньше, равно и больше.

Класс Eq. Сравнение на равенство

Вспомним определение класса Eq:

class Eq a where

(==) :: a -> a -> Bool

(/=) :: a -> a -> Bool

a == b = not (a /= b)

a /= b = not (a == b)

Появились две детали, о которых я умолчал в предыдущей главе. Это две последние строчки. В них

мы видим определение == через /= и наоборот. Это определения методов по умолчанию. Такие определения

дают нам возможность определять не все методы класса, а лишь часть основных, а все остальные мы получим

автоматически из определений по умолчанию.

Казалось бы почему не оставить в классе Eq один метод а другой метод определить в виде отдельной

функции:

class Eq a where

(==) :: a -> a -> Bool

(/=) :: Eq a => a -> a -> Bool

a /= b = not (a == b)

Так не делают по соображениям эффективности. Есть типы для которых проще вычислить /= чем ==.

Тогда мы определим тот метод, который нам проще вычислять и второй получим автоматически.

Набор основных методов, через которые определены все остальные называют минимальным полным опре-

делением (minimal complete definition) класса. В случае класса Eq это метод == или метод /=.

Мы уже вывели экземпляр для Eq, поэтому мы можем пользоваться методами == и /= для значений типа

Nat:

*Calendar> :l Nat

[1 of 1] Compiling Nat

( Nat. hs, interpreted )

Ok, modules loaded: Nat.

*Nat> Zero == Succ (Succ Zero)

False

it :: Bool

*Nat> Zero /= Succ (Succ Zero)

True

it :: Bool

Класс Num. Сложение и умножение

Сложение и умножение определены в классе Num. Посмотрим на его определение:

*Nat> :i Num

class (Eq a, Show a) => Num a where

(+) :: a -> a -> a

(*) :: a -> a -> a