52700.fb2
удовлетворяют ли все элементы списка данному предикату.
all :: (a -> Bool) -> [a] -> Bool
all p []
= True
all p (x:xs)
| p x
= all p xs
| otherwise = False
С помощью охранных выражений можно очень наглядно описывать условные выражения. Но иногда мож-
но обойтись и простыми логическими операциями. Например функцию all можно было бы определить так:
Условные выражения | 63
all :: (a -> Bool) -> [a] -> Bool
all
p
[]
= True
all
p
(x:xs)
= p x && all p xs
Или так:
all :: (a -> Bool) -> [a] -> Bool
all
p
xs = null (filter notP xs)
where notP x = not (p x)
Или даже так:
import Prelude(all)
Функция null определена в Prelude она возвращает True только если список пуст.
if-выражения
В композиционном стиле в качестве условных выражений используются уже знакомые нам if-выражения.
Вспомним как они выглядят:
a = if bool
then x1
else 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