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

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

method2 :: a -> ...

...

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

считается полный отказ от табуляции.