52700.fb2
tree = 1 (3 4) 5 (6 2 7 8)
По этой записи мы можем понять, что у нас есть два конструктора трёх аргументов 1 и 6, один конструктор
одного аргумента 3 и пять примитивных конструкторов. Точно так же мы строим и все другие константы в
Haskell:
Succ (Succ (Succ Zero))
Time (Hour 13) (Minute 10) (Second 0)
Mul (Add One Ten) (Neg (Mul Six Zero))
За одним исключением, если конструктор бинарный, символьный (начинается с двоеточия), мы помеща-
ем его между аргументов:
(One :+ Ten) :* (Neg (Six :* Zero))
3.3 Структура функций
Функции описывают одни значения в терминах других. При этом важно понимать, что функция это лишь
новое имя, пусть и составное. Мы можем написать 5, или 2+3, это лишь два разных имени для одной кон-
станты. Теперь мы разобрались с тем, что константы это деревья. Значит функции строят одни деревья из
других. Как они это делают? Для этого этого в Haskell есть две операции: это композиция и декомпозиция де-
ревьев. С помощью композиции мы строим из простых деревьев сложные, а с помощью декомпозиции разбиваем
составные деревья на простейшие.
Композиция и декомпозиция объединены в одной операции, с которой мы уже встречались, это операция
определения синонима. Давайте вспомним какое-нибудь объявление функции:
(+) a
Zero
= a
(+) a
(Succ b)
= Succ (a + b)
Смотрите в этой функции слева от знака равно мы проводим декомпозицию второго аргумента, а в правой
части мы составляем новое дерево из тех значений, что были нами получены слева от знака равно. Или
посмотрим на другой пример:
show (Time h m s) = show h ++ ”:” ++ show m ++ ”:” ++ show s
Слева от знака равно мы также выделили из составного дерева (Time h m s) три его дочерних для корня
узла и связали их с переменными h, m и s. А справа от знака равно мы составили из этих переменных новое
выражение.
Итак операцию объявления синонима можно представить в таком виде:
name
декомпозиция
=
композиция
В каждом уравнении у нас три части: новое имя, декомпозиция, поступающих на вход аргументов, и
композиция нового значения. Теперь давайте остановимся поподробнее на каждой из этих операций.
Структура функций | 45
Композиция и частичное применение
Композиция строится по очень простому правилу, если у нас есть значение f типа a -> b и значение x
типа a, мы можем получить новое значение (f x) типа b. Это основное правило построения новых значений,
поэтому давайте запишем его отдельно:
f :: a -> b,
x :: a
--------------------------
(f x) :: b
Сверху от черты, то что у нас есть, а снизу от черты то, что мы можем получить. Это операция называется