52700.fb2
...
methodN :: a -> ...
Экземпляры классов типов
Нам встретилась одна конструкция определения экземпляров классов типов:
instance Name Type where
method1 x1 ... xN = ...
method2 x1 ... xM = ...
...
methodN x1 ... xP = ...
Типы, значения и классы типов
Каждое значение имеет тип. Значение v имеет тип T на Haskell:
v :: T
Функциональный тип обозначается стрелкой: a -> b
fun :: a -> b
Тип значения может иметь контекст, он говорит о том, что параметр должен принадлежать классу типов:
fun1 :: С a
=> a -> a
fun2 :: (C1 a, C2, ... , CN) => a -> a
Суперклассы
Также контекст может быть и у классов, запись
class A a => B a where
...
Означает, что класс B целиком содержится в A, и перед тем как объявлять экземпляр для класса B, необ-
ходимо определить экземпляр для класса A. При этом класс A называют суперклассом для B.
1.7 Двумерный синтаксис
Наверное вы обратили внимание на то, что в Haskell нет разделителей строк и дополнительных скобок,
которые бы указывали границы определения классов или функций. Компилятор Haskell ориентируется по
переносам строки и отступам.
Так если мы пишем в классе:
class Eq a where
(==) :: a -> a -> a
(/=) :: a -> a -> a
По отступам за первой строкой определения компилятор понимает, что класс содержит два метода. Если
бы мы написали:
class Eq a where
(==) :: a -> a -> a
(/=) :: a -> a -> a
22 | Глава 1: Основы
То смысл был бы совсем другим. Теперь мы определяем класс Eq с одним методом == и указываем тип
некоторого значения (/=). Основное правило такое: конструкции, расположенные на одном уровне, вырав-
ниваются с помощью отступов. Чем правее находится определение, тем глубже оно вложено в какую-нибудь
специальную конструкцию. Пока нам встретилось лишь несколько специальных конструкций, но дальше
появятся и другие. Часто отступы набираются с помощью табуляции. Это удобно. Но лучше пользоваться
пробелами или настроить ваш любимый текстовый редактор так, чтобы он автоматически заменял табуля-
цию на пробелы. Зачем это нужно? Дело в том, что в разных редакторах на табуляцию может быть назначено
разное количество пробелов, так код набранный с двухзначной табуляцией будет очень трудно прочитать
если открыть его в редакторе с четырьмя пробелами вместо табуляции. Поскольку очень часто табуляция
перемежается с пробелами и выравнивание может “поехать”. Поэтому признаком хорошего стиля в Haskell
считается полный отказ от табуляции.