На этом шаге мы рассмотрим назначение и использование этих операций.
Традиционно в математике f(a) понимается как результат применения функции f к значению аргумента a. На месте аргумента, или иначе - операнда, может стоять любое выражение, значение которого вычисляется перед применением функции, а на месте операции, т.е. конструкции, которую можно применить к значению операнда - только имя некоторой функции. Налицо определённая асимметрия.
С этого момента предлагается рассматривать f(a) как результат выполнения операции аппликации (применения) с аргументами f и a.
Иными словами,
f(a) ↔ apply(f,a).
Обобщение состоит в том, что операция apply вычисляет оба своих аргумента и имеет следующий тип:
(a -> a) -> (a -> a).
В языке Haskell операция аппликации записывается так:
apply(f,a) ↔ f a
apply (apply (add 0,3),5).
То, что apply вычисляет оба своих аргумента, даёт возможность вычислить значение данного выражения. Значением apply (add 0,3) будет функция одного аргумента, которая прибавляет к нему значение 3, значением константы является сама константа. Далее может быть вычислено внешнее вхождение apply, что и даст результат - 8.
Итак, введение операции apply позволяет:
Эта конструкция определяется так:
f $ x = f x
Операция нестрогой аппликации является полным аналогом операции композиции (.), однако её приоритет (равный 0) ниже приоритетов всех остальных операций, поэтому она применяет функцию к аргументам и избавляет от необходимости использовать скобки.
Например, можно
(1) вместо (f x) писать f $ x; (2) вместо f (g (h x)) писать f $ g $ h x; (3) вместо (+) 2 ((*) 3 4) писать (+) 2 $ (*) 3 4.
Операция строгой аппликации ($!) будет рассмотрена в следующих шагах.
Приведем примеры использования этой операции
-- Демонстрация работы с функциями модуля Prelude (2001) -- с использованием: -- (1) операции аппликации f x; -- (2) операции нестрогой аппликации функции ($); -------------------------------------------------- -- (3) операции композиции функций f(g(h(x))); -- (4) операции композиции функций (.); -- (5) операции композиции функций в бесточечном стиле -- **************************************************** x = pi/2 f1 = sin x f2 = asin $ sin $ acos $ cos x ------------------------------ f3 = asin (sin (acos (cos x))) f4 = (log.exp) 10 -- Инфиксная форма записи (.) f5 = (asin.sin.acos.cos) x -- Инфиксная форма записи (.) f6 = (.) asin sin x -- Префиксная форма записи (.) ------------------------------------------------------------ f7 = (.) ((.) ((.) asin sin) acos) cos x
На следующем шаге мы рассмотрим операцию композиции функций.