Curry накапливает аргументы в замыкании и вызывает исходную функцию, когда достигнута заданная арность; каждый частичный вызов сохраняет независимую ветку.
Реализуйте декоратор (curry) для каррирования функции с фиксированным числом аргументов: он должен позволять вызывать функцию с частичным набором аргументов до тех пор, пока не будет передано необходимое количество аргументов.
Curry накапливает аргументы в замыкании и вызывает исходную функцию, когда достигнута заданная арность; каждый частичный вызов сохраняет независимую ветку.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Curry накапливает аргументы в замыкании и вызывает исходную функцию, когда достигнута заданная арность; каждый частичный вызов сохраняет независимую ветку.
В этом варианте this берётся из первого вызова, лишние аргументы отбрасываются:
function curry(fn, arity = fn.length) {
if (!Number.isInteger(arity) || arity < 0) throw new RangeError('arity');
return function (...args) {
const context = this;
function collect(values) {
if (values.length >= arity) return fn.apply(context, values.slice(0, arity));
return (...more) => collect([...values, ...more]);
}
return collect(args);
};
}
const add = curry((a, b, c) => a + b + c);
add(1)(2, 3); // 6
Для функций с default/rest-параметрами fn.length может не отражать нужную арность; передайте её явно.