52700.fb2
Prelude> let onlyFive = const 5
Prelude> :t onlyFive
onlyFive :: b -> Integer
Prelude> onlyFive ”Hi”
5
Prelude> onlyFive (1,2,3)
5
Prelude> map onlyFive ”abracadabra”
[5,5,5,5,5,5,5,5,5,5,5]
72 | Глава 5: Функции высшего порядка
С её помощью мы можем легко построить и постоянную функцию двух аргументов:
const2 a = const (const a)
Вспомним определение для && :
(&& ) :: Bool -> Bool -> Bool
(&& ) True
x
= x
(&& ) False
_
= False
С помощью функций id и const мы можем сократить число аргументов и уравнений:
(&& ) :: Bool -> Bool -> Bool
(&& ) a = if a then id else (const False)
Также мы можем определить и логическое “или”:
(||) :: Bool -> Bool -> Bool
(||) a = if a then (const True) else id
Функция композиции
Функция композиции принимает две функции и составляет из них последовательное применение функ-
ций:
(. ) :: (b -> c) -> (a -> b) -> a -> c
(. ) f g = \x -> f (g x)
Это очень полезная функция. Она позволяет нанизывать функции друг на друга. Мы перехватываем выход
второй функции, сразу подставляем его в первую и возвращаем её выход в качестве результата. Например
перевернём список символов и затем сделаем все буквы заглавными:
Prelude> :m +Data.Char
Prelude Data.Char> (map toUpper . reverse) ”abracadabra”
”ARBADACARBA”
Приведём пример посложнее:
add :: Nat -> Nat -> Nat
add
a
Zero
= a
add
a
(Succ b) = Succ (add a b)
Если мы определим функцию свёртки для Nat, которая будет заменять в значении типа Nat конструкторы
на соответствующие по типу функции:
foldNat :: a -> (a -> a) -> Nat -> a