Учебник по Haskell | страница 67
x2
Слова if, then и else – ключевые. Тип a, x1 и x2 совпадают.
Любое охранное выражение, в котором больше одной альтернативы, можно представить в виде if-
выражения и наоборот. Перепишем все функции их предыдущего подраздела с помощью if-выражений:
hallCapacity :: Int -> HowMany
hallCapacity n =
if (n < 10)
then Little
else (if n < 30
then Enough
else Many)
all :: (a -> Bool) -> [a] -> Bool
all p []
= True
all p (x:xs) = if (p x) then all p xs else False
4.4 Определение функций
Под функцией мы понимаем составной синоним, который принимает аргументы, возможно разбирает их
на части и составляет из этих частей новые выражения. Теперь посмотрим как такие синонимы определяются
в каждом из стилей.
Уравнения
В декларативном стиле функции определяются с помощью уравнений. Пока мы видели лишь этот способ
определения функций, примерами могут служить все предыдущие примеры. Вкратце напомним, что функция
определяется набором уравнений вида:
name декомпозиция1 = композиция1
name декомпозиция2 = композиция2
...
name декомпозицияN = композицияN
Где name – имя функции. В декомпозиции происходит разбор поступающих на вход значений, а в компо-
зиции происходит составление значения результата. Уравнения обходятся вычислителем сверху вниз до тех
пор пока он не найдёт такое уравнение, для которого переданные в функции значения не подойдут в указан-
ный в декомпозиции шаблон значений (если сопоставление с образцом аргументов пройдёт успешно). Как
только такое уравнение найдено, составляется выражение справа от знака равно (композиция). Это значение
будет результатом функции. Если такое уравнение не будет найдено программа остановится с ошибкой.
К примеру попробуйте вычислить в интерпретаторе выражение notT False, для такой функции:
64 | Глава 4: Декларативный и композиционный стиль
notT :: Bool -> Bool
notT True = False
Что мы увидим?
Prelude> notT False
*** Exception: < interactive>:1:4-20: Non-exhaustive patterns in function notT
Интерпретатор сообщил нам о том, что он не нашёл уравнения для переданного в функцию значения.
Безымянные функции
В композиционном стиле функции определяются по-другому. Это необычный метод, он пришёл в
Haskell из лямбда-исчисления. Функции строятся с помощью специальных конструкций, которые называ-
ются лямбда-функциями. По сути лямбда-функции являются безымянными функциями. Давайте посмотрим
на лямбда функцию, которая прибавляет к аргументу единицу:
\x -> x + 1
Для того, чтобы превратить лямбда-функцию в обычную функцию мысленно замените знак \ на имя