Учебник по Haskell | страница 61



на структуре значений. Мы узнали, что константы в Haskell очень похожи на деревья, а запись констант

– на строчную запись дерева. Также мы присмотрелись к функциям и узнали, что операция определения

синонима состоит из композиции и декомпозиции значений.

name

декомпозиция

=

композиция

Существует несколько правил для построения композиций:

• Одно для функций в префиксной форме записи:

f :: a -> b,

x :: a

-------------------------------

(f x) :: b

• И два для функций в инфиксной форме записи:

Это левое сечение:

(*) :: a -> (b -> c),

x :: a

---------------------------------

(x *) :: b -> c

И правое сечение:

(*) :: a -> (b -> c),

x :: b

---------------------------------

(* x) :: a -> c

Декомпозиция происходит в аргументах функции. С её помощью мы можем извлечь из составной

константы-дерева какую-нибудь часть или указать на какие константы мы реагируем в данном уравнении.

Ещё мы узнали о частичном применении. О том, что все функции в Haskell являются функциями одного

аргумента, которые возвращают константы или другие функции одного аргумента.

Мы потренировались в составлении неправильных выражений и посмотрели как компилятор на основе

правил применения узнаёт что они неправильные. Мы узнали, что такое ограничение мономорфизма и как

оно появляется. Также мы присмотрелись к рекурсивным функциям.

56 | Глава 3: Типы

Succ

not

Рис. 3.7: Конструкторы и синонимы

3.7 Упражнения

• Составьте в интерпретаторе как можно больше неправильных выражений и посмотрите на сообще-

ния об ошибках. Разберитесь почему выражение оказалось неправильным. Для этого проверьте типы с

помощью правил применения. Составьте несколько выражений, ведущих к ошибке из-за ограничения

мономорфизма.

• Потренируйтесь в интерпретаторе с функциями map, filter и foldr. Попробуйте их с самыми разными

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

упражнениях.

• В этой главе было много картинок и графических аналогий, попробуйте попрограммировать в картин-

ках. Нарисуйте определённые нами функции или какие-нибудь новые в виде деревьев. Например, это

можно сделать так. Мы будем отличать конструкторы от синонимов. Конструкторы будем рисовать в

одинарном кружке, а синонимы в двойном.

one

=

Nat

Succ

Zero

Рис. 3.8: Синоним-константа

Мы будем все функции писать также как и прежде, но вместо аргументов слева от знака равно и выра-

жений справа от знака равно, будем рисовать деревья.

Например, объявим простой синоним-константу (рис. 3.8). Мы будем дорисовывать сверху типы зна-