Каррирование - преобразование функции с N аргументами в цепочку функций с одним аргументом:
// Обычная функция
function add(int $a, int $b): int { return $a + $b; }
// Каррированная версия
function curriedAdd(int $a): Closure {
return fn(int $b): int => $a + $b;
}
$add5 = curriedAdd(5);
echo $add5(3); // 8
echo $add5(10); // 15
// Универсальное каррирование
function curry(callable $fn): Closure {
$arity = (new ReflectionFunction($fn))->getNumberOfRequiredParameters();
$args = [];
$inner = function() use ($fn, $arity, &$args, &$inner) {
$args = array_merge($args, func_get_args());
return count($args) >= $arity ? $fn(...$args) : $inner;
};
return $inner;
}