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

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

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. Далее с

отступами пишутся имена определённых в классе значений. Значения класса называются методами.

Мы определяем лишь типы методов, конкретная реализация будет зависеть от типа a. Методы определя-

ются в экземплярах классов типов, мы скоро к ним перейдём.

Программистская аналогия класса типов это интерфейс. В интерфейсе определён набор значений (как

констант, так и функций), которые могут быть применены ко всем типам, которые поддерживают данный

интерфейс. К примеру, в интерфейсе “сравнение на равенство” для некоторого типа a определены две функ-

ции: равно (==) и не равно (/=) с одинаковым типом a -> a -> Bool, или в интерфейсе “печати” для любого

типа a определена одна функция show типа a -> String.

Математическая аналогия класса типов это алгебраическая система. Алгебра изучает свойства объекта в

терминах операций, определённых на нём, и взаимных ограничениях этих операций. Алгебраическая систе-

ма представляет собой набор операций и свойств этих операций. Этот подход позволяет абстрагироваться

от конкретного представления объектов. Например группа – это все объекты данного типа a, для которых

определены значения: константа – единица типа a, бинарная операция типа a -> a -> a и операция взятия

обратного элемента, типа a -> a. При этом на операции накладываются ограничения, называемые свойства-

ми операций. Например, ассоциативность бинарной операции, или тот факт, что единица с любым другим

элементом, применённые к бинарной операции, дают на выходе исходный элемент.

Давайте определим класс для группы:

class Group a where

e

:: a

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

inv :: a -> a

Класс с именем Group имеет для некоторого типа a три метода: константу e :: a, операцию (+) :: a ->

a -> a и операцию взятия обратного элемента inv :: a -> a.

Как и в алгебре, в Haskell классы типов позволяют описывать сущности в терминах определённых на них

операций или значений. В примерах мы указываем лишь наличие операций и их типы, так же и в классах

типов. Класс типов содержит набор имён его значений с информацией о типах значений.

Определив класс Group, мы можем начать строить различные выражения, которые будут потом интер-

претироваться специфическим для типа образом:

twice :: Group a => a -> a

twice a = a + a

isE :: (Group a, Eq a) => a -> Bool