Комбинаторное программирование

Комбинаторное программирование

Комбинáторное программирование (англ. 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», описанный в статье Джеймса Нобла.[2] Примеры такого использования можно найти в статье Е. Кирпичёва «Функциональное программирование в Java».[3]

См. также

Примечания

Ссылки

  • Pure Functions in APL and J (англ.) — использование неявного программирования в языках семейства APL



Wikimedia Foundation. 2010.

Игры ⚽ Нужен реферат?

Полезное


Смотреть что такое "Комбинаторное программирование" в других словарях:

  • Комбинаторная логика — направление математической логики, занимающееся фундаментальными  не нуждающимися в объяснении и не анализируемыми  понятиями и методами формальных логических систем или исчислений[1][2]. В дискретной математике тесно связана с λ… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»