Гибкое каррирование функции с произвольным числом вызовов

Накапливайте аргументы каждого вызова в новом массиве. Когда их не меньше заданной арности, вызывайте исходную функцию; иначе возвращайте следующую обёртку.

Короткий ответ

Что ответить на собеседовании

Накапливайте аргументы каждого вызова в новом массиве. Когда их не меньше заданной арности, вызывайте исходную функцию; иначе возвращайте следующую обёртку.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать функцию curry, которая позволяет частично вызывать переданную функцию, передавая аргументы постепенно через цепочку вызовов. Функция должна запоминать полученные аргументы и, как только их количество достигнет количества параметров оригинальной функции, выполнить её и вернуть результат.

function sum(a, b, c, d) {
    return a + b + c + d;
}

const curriedSum = curry(sum);

console.log(curriedSum(1)(2)(3)(4));       // 10
console.log(curriedSum(1, 2)(3)(4));       // 10
console.log(curriedSum(1)(2, 3, 4));       // 10

Ответ

Накапливайте аргументы каждого вызова в новом массиве. Когда их не меньше заданной арности, вызывайте исходную функцию; иначе возвращайте следующую обёртку.

function curry(fn, arity = fn.length) {
  const collect = previous => (...args) => {
    const all = [...previous, ...args];
    return all.length >= arity ? fn(...all) : collect(all);
  };
  return collect([]);
}

Все три примера дают 10. Независимые ветки частичного применения не портят друг друга, поскольку накопленный массив не мутируется. Для default/rest-параметров задайте arity явно: fn.length может быть меньше желаемого числа аргументов. Код предназначен для функции без зависимости от this; лишние аргументы передаются дальше.

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

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

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

Подробнее