Комбінаторне програмування (англ. function-level programming) — це парадигма програмування, не вимагає явного згадки аргументів визначається функції (програми) і використовує замість змінних комбінатори і композицію функцій (але не λ-абстракція). Таким чином комбінаторне програмування можна вважати особливою різновидом функціонального. Різновидом комбінаторного можна вважати конкатенативное програмування.
У мовах J і K (сучасних різновидах APL) цей підхід відомий як неявне програмування (англ. tacit programming).
Ось класичний приклад на мові J — визначення функції (в термінах J — дієслова) для обчислення середнього арифметичного:
avg =. +/ % #
Тут +/ — монада (унарная операція) підсумовування списку, % діада (бінарна операція) розподілу, а # діада взяття довжини списку. Дана конструкція (пропозиція мови J) читається «середнє є сума, поділена на довжину». Подібні конструкції з трьох функцій-дієслів у J прийнято називати «вилками».
За межами співтовариства АПЗ, функціональних мовах сімейства ML, то і на комбінаторне програмування haskell часто посилаються як на бесточечный стиль (стиль, вільний від покажчиків англ. бесточечный програмування, використовується також кілька зневажлива гра слів англ. безглуздо програмування).
Наприклад, просту функцію додавання списків на Хаскелл ми можемо «в лоб» визначити за допомогою рекурсії: сума (х:хз) = х + (сума хз) Сума [] = 0
Це визначення легко спростити, використовуючи комбінатор foldr: сума з XS = foldr (+) 0 хз
і, нарешті, ми можемо перевести його в бесточечную форму, вільну від явних імен параметрів: сума = foldr (+) 0
Здебільшого «вільними від покажчиків» є конкатенативные мови. У класичному Форте свобода від іменованих змінних досягається не математично, шляхом визначення функцій у вигляді комбінації якихось інших функцій, а імперативно, шляхом послідовних маніпуляцій зі стеком. Втім, в сучасних конкатенативных мовах, таких як Чинник, є тенденція до використання функціональних комбінаторів, а не очевидних маніпуляцій зі стеком.
Можливе використання даного стилю в нефункціональних мовами, не підтримують функції вищого порядку і часткове застосування. Функції вищого порядку можна імітувати, наприклад, за допомогою об'єктів. Для імітації часткового застосування служить патерн «Curried Object», описаний у статті Джеймса Нобла