Реализация функции автокаррирования для цепочки задач

Накопите аргументы до 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 не всегда соответствует желаемому количеству.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее