Комбинаторно програмиране
• Методи и алгоритми
Комбинаторно програмиране (англ. програмиране на функционално ниво ) Дали е парадигма за програмиране, която не изисква изрично споменаване на аргументите на функцията (програмата), която се дефинира и използва комбинатори и състав на функции (но не λ-абстракция) вместо променливи. По този начин комбинаторното програмиране може да се счита за специален вид функционалност. Конкатенативното програмиране може да се разглежда като вид комбинатор.
Съдържание
История на произхода
Идеята за описване на функциите без позоваване на техните аргументи се корени в математиката. През 1924 г., дори преди създаването на ламбда изчислението, Шейнфинкел създава комбинаторна логика - формализмът, на който се основава описаната тук парадигма (подобно на това как класическото функционално програмиране се основава на ламбда смятането на Църквата).
Парадигмата за програмиране, базирана на комбинаторната логика, е описана за пръв път от Джон Бакус в известната му лекция на Тюринг „Възможно ли е да се освободи програмирането от стила на фон Нойман“ [1] [2]. Въз основа на тези идеи Бакус създава FP езиците. и FL (англ.) руски. .
Имплицитно програмиране в J и K
В езиците J и K (съвременни вкусове на APL) този подход е известен като имплицитно програмиране (англ. мълчаливо програмиране ).
Ето класически пример в езика J - дефиниране на функция (от гледна точка на J - глагол) за изчисляване на средната аритметична стойност:
Тук +/е монадата (унарна операция) обобщение на списъка,% диада (двоична операция) разделение и # диада за вземане на дължината на списъка. Тази конструкция (J изречение на език) гласи "средната стойност е сумата, разделена на дължината". Такива конструкции на три глаголни функции в J обикновено се наричат „вилици".
Безсмисленият стил на съвременните функционални езици
Извън APL общността, на функционалните езици на семействата ML и Haskell, комбинаторното програмиране често се нарича безсмислен стил (стил, без английски указатели. безточково програмиране , използва се също донякъде унизителна английска игра на думи. безсмислено програмиране ).
Например можем да дефинираме проста функция за сумиране на списъци в Haskell, използвайки рекурсия: