Комбінаторне програмування (англ. function-level programming) парадигма програмування, що використовує принципи комбінáторної логіки, тобто не вимагає явного згадування аргументів визначаємої функції (програми) та використовує замість змінних комбінатори та композіції. Є особливим різновидом функційного програмування, але, на відміну від основного його напрямку, комбінаторне програмування не використовує λ-абстракцію).

Концептуалізував та популяризував парадигму Джон Бекус в тюрінговскій лекції 1977 року «Чи можливо звільнити від стилю програмування фон Неймана»[1], в якій представив мову FP[en]. Наприкінці 1980-х Бекус із колегами з Алмаденського дослідного центру IBM[en] в розвиток ідей FP і конкатенативної парадигми розробили мову FL[en]. При цьому елементи конкатенативне програмування проявляються вже в APL, а в пізніших його різновидах — мовами J и K — запозичені багато ідей FP, і оформлені в концепцію безточкового стилю, який може бути застосований не тільки для функціонального програмування в строгому сенсі (Зокрема, елементи такого стилю мають місце в оболонках UNIX при застосуванні конвеєрів для перенаправлення вводу-виводу.

Приклад для мови J: визначення функції (в термінах J — «дієслова») для обчислення середнього арифметичного:

avg =. +/ % #

де +/ — «монада» (унарна операція) підсумовування списку, % — «діада» (бінарна операція) ділення, а # — «діада» взяття довжини списку. Дана конструкція (в термінах J — «пропозиція») читається «середнє є сума, поділена на довжину». Подібні конструкції з трьох функцій-дієслів в J прийнято називати «виделками».

Виразні можливості сучасних універсальних функціональних мов, таких як ML та Haskell, дозволяють досить комфортно залишатися в парадигмі комбінаторного програмування, тобто, не вдаватися до λ-абстракції та змінним взагалі. Наприклад, функція підсумовування списків на Haskell з використанням комбінатора foldr:

sum = foldr (+) 0

Фактично, конкатенативне програмування забезпечує безточковий стиль, притому в ранніх конкатенативного мовах, таких як Форт, свобода від іменованих змінних досягається не математично, шляхом визначення функцій у вигляді комбінації якихось інших функцій, а імперативно, шляхом послідовних маніпуляцій зі стеком. В сучасних конкатенативних мовах, таких як Factor[en], є тенденція до використання функціональних комбінаторів, а не явних маніпуляцій зі стеком.

Можливо також використання безточкового стилю і в мовах, які не підтримують функції вищого порядку і часткове застосування, наприклад, за допомогою імітації функцій вищого порядку за допомогою шаблону Curried Object[2].

Зноски

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.