Накопите аргументы до fn.length, а пустые вызовы пусть просто возвращают очередной шаг. В примере есть опечатка laskChain, и цепочка с одними 2 и 3 ещё не набрала три аргумента.
Реализация функции автокаррирования для цепочки задач
Накопите аргументы до fn.length, а пустые вызовы пусть просто возвращают очередной шаг. В примере есть опечатка laskChain, и цепочка с одними 2 и 3 ещё не набрала три аргумента.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать функцию, преобразующую обычную функцию в её каррированную версию, позволяя вызывать её по частям с произвольным набором аргументов. После реализации должна работать следующая демонстрация:
const taskChain = (task1, task2, task3) => {
console.log(task1, task2, task3);
};
const curriedTaskChain = curry(laskChain);
curriedTaskChain()()()(1, 2, 3);
curriedTaskChain()()()(2)(3);
curriedTaskChain(1, 2, 3);
curriedTaskChain(1)()(2, 3);
Ответ
Накопите аргументы до fn.length, а пустые вызовы пусть просто возвращают очередной шаг. В примере есть опечатка laskChain, и цепочка с одними 2 и 3 ещё не набрала три аргумента.
function curry(fn, arity = fn.length) {
const collect = previous => (...args) => {
const all = [...previous, ...args];
return all.length >= arity ? fn(...all) : collect(all);
};
return collect([]);
}
const curriedTaskChain = curry(taskChain);
Вызовы ()()()(1,2,3), (1,2,3) и (1)()(2,3) выводят 1,2,3. Вызов ()()()(2)(3) возвращает функцию, ожидающую ещё один аргумент; подставлять отсутствующее значение нельзя. Для default/rest-параметров арность задаётся явно, поскольку fn.length не всегда соответствует желаемому количеству.