На этом шаге мы рассмотрим прагматику функционалов.
Функционалы (функции высшего порядка), такие как map и filter, играют в функциональном программировании роль, которую выполняют (аналогичные for и while) в языках императивного программирования. Однако эти управляющие структуры являются встроенными в язык, в то время как функционалы можно определить самостоятельно.
Это делает функциональное программирование очень гибким: имеется лишь небольшое число встроенных функций, но программист может самостоятельно конструировать свои программные инструменты.
В частности, функционалы удобно использовать для тестирования функций.
В заключение приведем небольшой демонстрационный пример.
-- Демонстрация использования для работы с функционалом map(): -- (1) бесточечной формы записи; -- (2) безымянных функций. -- -- Пусть необходимо применить функцию трёх переменных -- -- f(x,y,z)=x*(y+z) -- -- к каждому элементу заданного списка (для заданных x и y). -- Понятно, что "прямая" попытка -- -- > map (2*(2+)) [1,2,3] -- -- не удастся... -------------------------- -- Первый вариант решения: -------------------------- f = (*) g = (+) u = flip ((.) (flip ((.)(.) f)) g) ---------------------------------- -- Второй вариант решения: -------------------------- u1 = \x y z -> x*(y+z) -- *************************** -- Неудачные тестовые примеры: ----------------------------------------------- test1 = map (u 2 2) [1,2,3,4] == [6,8,10,12] && map (u 4 3) [1,2,3,4] == [16,20,24,28] ------------------------------------------------- test2 = map (u1 2 2) [1,2,3,4] == [6,8,10,12] && map (u1 4 3) [1,2,3,4] == [16,20,24,28] --------------------------------------------------------------- test21 = map ((\x y z -> x*(y+z)) 2 2) [1,2,3,4] == [6,8,10,12]
На следующем шаге мы рассмотрим представление функций с помощью карринга.