Шаг 43.
Основы языка Haskell.
Основные функции библиотеки Prelude. Операции аппликации (применения)

    На этом шаге мы рассмотрим назначение и использование этих операций.

Операция аппликации

    Традиционно в математике f(a) понимается как результат применения функции f к значению аргумента a. На месте аргумента, или иначе - операнда, может стоять любое выражение, значение которого вычисляется перед применением функции, а на месте операции, т.е. конструкции, которую можно применить к значению операнда - только имя некоторой функции. Налицо определённая асимметрия.

    С этого момента предлагается рассматривать f(a) как результат выполнения операции аппликации (применения) с аргументами f и a.

    Иными словами,

   f(a)  ↔ apply(f,a).

    Обобщение состоит в том, что операция apply вычисляет оба своих аргумента и имеет следующий тип:

   (a -> a) -> (a -> a).

    В языке Haskell операция аппликации записывается так:

   apply(f,a)  ↔ f a


    Замечание (для знатоков каррирования). Введённое обобщение необходимо для работы с объектами функционального типа, которые неизбежно появляются при каррировании функций многих переменных. Так, если рассматривать add как каррированную функцию, то для сложения двух чисел 3 и 5 необходимо записать
   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
Файл с примерами можно взять здесь.

    На следующем шаге мы рассмотрим операцию композиции функций.




Предыдущий шаг Содержание Следующий шаг