На этом шаге мы рассмотрим использование данной операции.
Математическая нотация вызова функции традиционна полагала заключение входных параметров функции в круглые скобки - (). Эту традицию переняли практически все языки императивного программирования. Однако в языках функционального программирования принята иная нотация: имя функции отделяется от её параметров просто пробелом, и сами аргументы также отделяются друг от друга пробелами.
Операция (оператор) композиции функций перешла в язык Haskell из математики, где композиция функций определяется как применение первой функции к результату, который был возвращён в результате вычисления значения второй функции.
Операция (оператор) композиции функций (.) определяется так:
(.):: (b -> c) -> (a -> b) -> a -> c (f . g) x = f (g x)
Операцию композиции можно выразить с помощью операции аппликации.
Prelude> (sin . cos) 4 Prelude> sin $ cos 4 -0.608083 -0.608083
В качестве иллюстрации использования данной операции приведем примеры из предыдущкго шага:
-- Демонстрация работы с функциями модуля 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
На следующем шаге мы рассмотрим определение функций с помощью замыкания.