52700.fb2
[]
:: [a]
(:)
:: a -> [a] -> [a]
Конструктор пустого списка [] является константой, а конструктор объединения элемента со списком
(:), является функцией. Когда я говорил, что типы определяют примитивы и методы составления из прими-
тивов, я имел ввиду, что некоторые конструкторы по сути являются константами, а другие функциями.
Эти “методы” определяют базовые значения типа, все другие значения будут комбинациями базовых.
При этом сумма типов, определяет число методов “классе” типа, то есть число базовых значений, а произ-
ведение типов в каждой альтернативе определяет имя метода (именем конструктора) и состав аргументов
(перечислением подтипов).
3.2 Структура констант
Мы уже знаем, что значения могут быть функциями и константами. Объявляя константу, мы даём имя-
синоним некоторой комбинации базовых конструкторов. В функции мы говорим как по одним значениям
получить другие. В этом и следующем разделе мы посмотрим на то, как типы определяют структуру констант
и функций.
Давайте присмотримся к константам:
Succ (Succ Zero)
Neg (Add One (Mul Six Ten))
Not (Follows A (And A B))
Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil)))
Заменим все функциональные конструкторы на букву f (от слова function), а все примитивные конструк-
торы на букву c (от слова constant).
f (f c)
f (f c (f c c))
f (f c (f c c))
f c (f c (f c (f c c)))
Те кто знаком с теорией графов, возможно уже узнали в этой записи строчную запись дерева. Все зна-
чения в Haskell являются деревьями. Узел дерева содержит составной конструктор, а лист дерева содержит
примитивный конструктор. Далее будет небольшой подраздел посвящённый терминологии теории графов,
которая нам понадобится, будет много картинок, если вам это известно, то вы можете спокойно его пропу-
стить.
Структура констант | 41
Несколько слов о теории графов
Если вы не знакомы с теорией графов, то сейчас как раз самое время с ней познакомится, хотя бы на
уровне основных терминов. Теория графов изучает дискретные объекты в терминах зависимостей между
объектами или связей. При этом объекты и связи можно изобразить графически.
Граф состоит из узлов и рёбер, которые соединяют узлы. Приведём пример графа:
8
7
c
f
6
a
b
d
e
5
1