Мы разобрали три комбинатора неподвижной точки — Карри, Тьюринга и Z — и пора сказать, что вообще такое комбинатор. Комбинатор — это замкнутый λ-терм, без свободных переменных: он ничего не берёт из окружения, а только тасует и склеивает собственные аргументы. Таких термов множество, мы посмотрим наиболее часто встречаемые:
- — тождество: отдаёт аргумент как есть.
- — константа: берёт первый аргумент, второй отбрасывает.
- — подстановка: раздаёт и в , и в , затем применяет одно к другому.
- — композиция: прогоняет через , потом через .
- — перестановка: меняет местами два аргумента.
- — удвоение: скармливает функции дважды.
На Haskell комбинаторы выглядят так:
id 5 -- => 5 (I)
const 1 2 -- => 1 (K)
ap (+) (*2) 3 -- => 9 = 3 + 3*2 (S)
((+1) . (*2)) 3 -- => 7 = 3*2 + 1 (B)
flip (-) 3 10 -- => 7 = 10 - 3 (C)
join (*) 4 -- => 16 = 4*4 (W)