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

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

(Zero,

Zero)

-> True

(Succ a’, Succ b’)

-> a’ == b’

_

-> False

Мы проводим сопоставление с образцом по кортежу (a, b), соответственно слева от знака -> мы прове-

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

Давайте определим функцию filter в ещё более композиционном стиле. Для этого мы заменим в исход-

ном определении where на let и декомпозицию в аргументах на case-выражение:

filter :: (a -> Bool) -> [a] -> [a]

filter

p

a =

case a of

[]

-> []

x:xs

->

let rest = filter p xs

in

if (p x)

then (x:rest)

else rest

4.3 Условные выражения

С условными выражениями мы уже сталкивались в сопоставлении с образцом. Например в определении

функции not:

not True

= False

not False = True

В зависимости от поступающего значения мы выбираем одну из двух альтернатив. Условные выражении

в сопоставлении с образцом позволяют реагировать лишь на частичное (с учётом переменных) совпадение

дерева значения в аргументах функции.

Часто нам хочется определить более сложные условия для альтернатив. Например, если значение на

входе функции больше 2, но меньше 10, верни A, а если больше 10, верни B, а во всех остальных случаях

верни C. Или если на вход поступила строка состоящая только из букв латинского алфавита, верни A, а

в противном случае верни B. Нам бы хотелось реагировать лишь в том случае, если значение некоторого

типа a удовлетворяет некоторому предикату. Предикатами обычно называют функции типа a -> Bool. Мы

говорим, что значение удовлетворяет предикату, если предикат для этого значения возвращает True.

62 | Глава 4: Декларативный и композиционный стиль

Охранные выражения

В декларативном стиле условные выражения представлены охранными выражениями (guards). Предполо-

жим у нас есть тип:

data HowMany = Little | Enough | Many

И мы хотим написать функцию, которая принимает число людей, которые хотят посетить выставку, а

возвращает значение типа HowMany. Эта функция оценивает вместительность выставочного зала. С помощью

охранных выражений мы можем написать её так:

hallCapacity :: Int -> HowMany

hallCapacity n