Учебник по Haskell | страница 25
jonny :: Week -> Status
jonny x = ...
colin :: Week -> Status
colin x = ...
Конкретное определение сейчас не важно, важно, что они определяют зависимость статуса (Status) от
дня недели (Week) для работников Джонни (jonny) и Колина (colin).
Также у нас есть полезная функция:
calendar :: Date -> Week
calendar x = ...
Она определяет по дате день недели. И теперь, зная лишь эти функции, мы можем спросить у вычислителя
будет ли у Джонни выходной 8 августа 3043 года:
jonny (calendar (Date (Year 3043) August (Day 8)))
=> jonny Saturday
=> Rest
Интересно, у нас опять всего лишь два значения, но, дав такое большое имя одному из значений, мы
смогли получить полезную нам информацию, ничего не вычисляя.
1.4 Классы типов
Если типы и значения – привычные понятия, которые можно найти в том или ином виде в любом языке
программирования, то термин класс типов встречается не часто. У него нет аналогов и в обычном языке,
поэтому я сначала постараюсь объяснить его смысл на примере.
В типизированном языке у каждой функции есть тип, но бывают функции, которые могут быть опреде-
лены на аргументах разных типов; по сути, они описывают схожие понятия, но определены для значений
разных типов. Например, функция сравнения на равенство, говорящая о том, что два значения одного типа
a равны, имеет тип a -> a -> Bool, или функция печати выражения имеет тип a -> String, но что такое
a в этих типах? Тип a является любым типом, для которого сравнение на равенство или печать (преобразо-
вание в строку) имеют смысл. Это понятие как раз и кодируется в классах типов. Классы типов (type class)
позволяют определять функции с одинаковым именем для разных типов.
У классов типов есть имена. Также как и имена классов, они начинаются с большой буквы. Например,
класс сравнений на равенство называется Eq (от англ. equals – равняется), а класс печати выражений имеет
имя Show (от англ. show – показывать). Посмотрим на их определения:
Класс Eq:
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
Класс Show:
1Было бы точнее называть вычислитель редуктором, поскольку мы проводим редукции, или замену эквивалентных значений, но
закрепилось это название. К тому же, редуктор также обозначает прибор.
18 | Глава 1: Основы
class Show a where
show :: a -> String
За ключевым словом class следует имя класса, тип-параметр и ещё одно ключевое слово where. Далее с
отступами пишутся имена определённых в классе значений. Значения класса называются