Шаг 107.
Основы языка Haskell.
Функционалы (функции высшего порядка). Прагматика функционалов

    На этом шаге мы рассмотрим прагматику функционалов.

    Функционалы (функции высшего порядка), такие как 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]
Файл с примерами можно взять здесь.

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




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