З практичної точки зору комбінатори - це різновиди програмних конструкцій, які дозволяють скласти частинки логіки за цікавими та часто досконалими способами. Зазвичай їх використання залежить від можливості можливості упаковки виконуваного коду в об'єкти, які часто називаються (з історичних причин) лямбда-функціями або лямбда-виразами, але ваш пробіг може змінюватися.
Простий приклад (корисного) комбінатора - той, який приймає дві лямбда-функції без параметрів і створює нову, яка виконує їх послідовно. Фактичний комбінатор виглядає в загальному псевдокоді так:
func in_sequence(first, second):
lambda ():
first()
second()
Найважливіше, що робить цей комбінатор - це анонімна функція (лямбда-функція) у другому рядку; коли ви телефонуєте
a = in_sequence(f, g)
отриманий об'єкт a не є результатом запуску спочатку f (), а потім g (), але це об'єкт, який ви можете зателефонувати пізніше для виконання f () та g () в послідовності:
a() // a is a callable object, i.e. a function without parameters
Ви також можете мати комбінатор, який паралельно виконує два кодові блоки:
func in_parallel(first, second):
lambda ():
t1 = start_thread(first)
t2 = start_thread(second)
wait(t1)
wait(t2)
А потім знову,
a = in_parallel(f, g)
a()
Прикольне те, що 'in_parallel' і 'in_sequence' є обома комбінаторами з одним типом / підписом, тобто вони обидва беруть два параметричних об'єкта функцій і повертають новий. Потім ви можете писати такі речі
a = in_sequence(in_parallel(f, g), in_parallel(h, i))
і працює як очікувалося.
В основному комбінатори дозволяють побудувати контрольний потік програми (серед іншого) процедурним та гнучким способом. Наприклад, якщо ви використовуєте in_parallel (..) комбінатор для запуску паралелізму у вашій програмі, ви можете додати налагодження, пов’язане з цим, до реалізації самого in_parallel комбінатора. Пізніше, якщо ви підозрюєте, що у вашій програмі є помилка, пов’язана з паралелізмом, ви можете насправді просто повторити в_parallel:
in_parallel(first, second):
in_sequence(first, second)
і одним штрихом усі паралельні ділянки перетворені на послідовні!
Комбінатори дуже корисні при правильному використанні.
Однак комбінатор Y не потрібен у реальному житті. Це комбінатор, який дозволяє створювати саморекурсивні функції, і ви можете легко їх створювати на будь-якій сучасній мові без комбінатора Y.