Комбинаторное программирование
Комбинáторное программирование (англ. function-level programming) — это парадигма программирования, не требующая явного упоминания аргументов определяемой функции (программы) и использующая вместо переменных комбинаторы и композицию функций (но не λ-абстракцию). Таким образом комбинаторное программирование можно считать особой разновидностью функционального.
История возникновения
Идея описания функций без обращения к их аргументам берет свои корни из математики. В 1924 г., еще до создания лямбда-исчисления, Шейнфинкель создал комбинáторную логику — формализм, на котором основана описываемая здесь парадигма (подобно тому, как классическое функциональное программирование основано на лямбда-исчислении Чёрча).
Парадигму программирования, основанную на комбинаторной логике впервые описал Джон Бэкус в своей знаменитой тьюринговской лекции «Может ли программирование освободится от стиля Фон-Неймана»[1] На основе данных идей Бэкус создал языки FP (англ.) и FL (англ.).
Неявное программирования в J и K
В языках J и K (англ.) — современных разновидностях APL этот подход известен как Неявное программирование (англ. tacit programming).
Вот классический пример на языке J — определение функции (в терминах J — глагола) для вычисления среднего арифметического:
avg =. +/ % #
Здесь +/
— монада (унарная операция) суммирования списка, %
диада (бинарная операция) деления, а #
диада взятия длины списка. Данная конструкция (предложение языка J) читается «среднее есть сумма, поделенная на длину». Подобные конструкции из трёх функций-глаголов в J принято называть «вилками».
Бесточечный стиль современных функциональных языков
За пределами сообщества APL, в функциональных языках семейства ML и Haskell на комбинаторное программирование часто ссылаются как на бесточечный стиль (стиль, свободный от указателей англ. point-free programming, используется также несколько уничижительная игра слов англ. pointless programming).
К примеру простую функцию суммирования списков на Haskellе мы можем «в лоб» определить с помощью рекурсии:
sum (x:xs) = x + (sum xs)
sum [] = 0
Это определение легко упростить, используя комбинатор foldr
:
sum xs = foldr (+) 0 xs
и, наконец, мы можем перевести его в бесточечную форму, свободную от явных имён параметров:
sum = foldr (+) 0
Другие языки
По большей части «свободными от указателей», так же являются конкатенативные языки. В классическом форте свобода от именованных переменных достигается не математически, путём определения функций в виде комбинации каких-то других функций, а императивно, путём последовательных манипуляций со стеком. Впрочем в современных конкатенативных языках, таких как Фактор, имеется тенденция к использованию функциональных комбинаторов, а не явных манипуляций со стеком.
Возможно использование данного стиля в нефункциональных языках, не поддерживающих функции высшего порядка и частичное применение. Функции высшего порядка можно имитировать, к примеру, с помощью объектов. Для имитации частичного применения служит паттерна «Curried Object», описаный в статье Джеймса Нобла «Arguments and results» (Формат PostScript, 808KB). Примеры такого использования можно найти в статье Е. Кирпичёва Функциональное программирование в Java
См. также
- Tacit programming(англ.)
Примечания
Ссылки
- Бесточечный стиль(рус.) - раздел в статье Евгения Кирпичёва Элементы функциональных языков в 3-м выпуске журнала Практика функционального программирования
- Can Programming Be Liberated from the von Neumann Style?(англ.) Тьюринговская лекция Джона Бэкуса.
- Pure Functions in APL and J(англ.) — использование неявного программирования в языках семейства APL
SQL | Это незавершённая статья о компьютерных языках. Вы можете помочь проекту, исправив и дополнив её. |
cs:Function-level programování en:Function-level programming es:Programación a nivel funcional gl:Programación a nivel funcional
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....