ВУЗ:
Составители:
Это пример функции с каррингом. Для того, чтобы получить тот же результат без
карринга, мы могли бы использовать кортеж:
add1 :: (Integer,Integer) -> Integer
add1 (x,y) = x + y
Нетрудно увидеть, что эта версия сложения есть в действительности просто функция од-
ного аргумента!
Применение add
имеет форму
add e
1
e
2
, и это эквивалентно
(add e
1
) e
2
, так как
функциональная аппликация (применение) является лево–ассоциативной. Другими слова-
ми, применение add
к одному аргументу возвращает новую функцию, которая затем при-
меняется ко второму аргументу. Это соответствует типу
add
, который есть
Integer->Integer->Integer
,
что эквивалентно
Integer->(Integer->Integer)
;
то есть конструктор типа ->
является право–ассоциативным.
10.2 Функции высших порядков
Используя
add
, мы можем определить функцию
inc
способом отличным от преды-
дущего:
inc :: Int -> Int
inc = add 1
> inc 3 -- это вызов функции inc
4 -- а это результат вызова
Мы видим пример частичной аппликации функции с каррингом и, кроме того, получаем,
что в результате вычисления может возвращаться функция. Давайте рассмотрим случай, в
котором полезно использовать функцию как аргумент. Функция
map
– отличный пример:
map :: (a->b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
Функция
map
из списка создает новый список, заменяя элементы на результат применения
к ним функции
f
. Функциональная аппликация имеет наивысший приоритет среди всех
инфиксных операторов и, таким образом, правая сторона второго уравнения грамматиче-
ски разбирается как
(f x) : (map f xs).
Функция
map
– полиморфная и ее тип несо-
мненно указывает, что первый аргумент – функция.
e1 :: [Int]
e1 = map (add 1) [1,2,3]
> e1
[2,3,4]
Следующее определение эквивалентно e1
e2 :: [Int]
e2 = map inc [1,2,3]
> e2
[2,3,4]
74
Страницы
- « первая
- ‹ предыдущая
- …
- 72
- 73
- 74
- 75
- 76
- …
- следующая ›
- последняя »