🟨 JavaScript
Средняя
🕐 15 мин

Функция суммирования с поддержкой каррирования

Цель: создать функцию, которая суммирует аргументы из цепочки вызовов, используя технику каррирования.

💡 Подсказка к решению
  1. Ваша основная функция sum должна принимать первый аргумент и возвращать другую (внутреннюю) функцию.
  2. Если sum вызвана без аргументов (sum()), она должна сразу вернуть 0.
  3. Внутренняя функция должна принимать следующий аргумент. Если он передан, она добавляет его к накопленной сумме и возвращает саму себя, чтобы цепочка могла продолжаться.
  4. Если внутренняя функция вызвана без аргументов, это сигнал к завершению. В этом случае она должна вернуть итоговую сумму.
  5. Для хранения суммы используйте переменную, замкнутую в области видимости.
👀 Решение
const sum = (initialValue) => {
  // Если sum() вызвана без аргументов, возвращаем 0.
  if (initialValue === undefined) {
    return 0;
  }
 
  // Сохраняем текущую сумму в замыкании.
  let total = initialValue;
 
  // Возвращаем внутреннюю функцию, которая будет обрабатывать
  // последующие вызовы в цепочке.
  const innerFunc = (nextValue) => {
    // Если внутреннюю функцию вызвали без аргументов (например, ...() ),
    // это сигнал для завершения. Возвращаем накопленную сумму.
    if (nextValue === undefined) {
      return total;
    }
 
    // Если передан аргумент, добавляем его к сумме
    // и возвращаем саму себя для продолжения цепочки.
    total += nextValue;
    return innerFunc;
  };
 
  return innerFunc;
};

Пошаговое объяснение кода:

  1. const sum = (initialValue) => { ... }

    • sum — это внешняя функция, которая запускает процесс. Она принимает необязательный initialValue.
    • Если initialValue не передан (sum()), мы сразу возвращаем 0.
  2. let total = initialValue;

    • Мы создаем переменную total для хранения накопленной суммы. Она “замкнута” и будет доступна для внутренней функции innerFunc при каждом последующем вызове.
  3. const innerFunc = (nextValue) => { ... }

    • Это “сердце” нашего решения. Эта функция возвращается из sum и обрабатывает все последующие вызовы.
    • if (nextValue === undefined): Мы проверяем, был ли передан аргумент. Если нет (()), это означает конец цепочки, и мы возвращаем total.
    • total += nextValue;: Если аргумент есть, мы прибавляем его к total.
    • return innerFunc;: Самое главное — мы возвращаем саму функцию innerFunc. Это позволяет вызывать ее снова и снова, создавая цепочку.

Почему это работает (магия замыканий):

Каждый раз, когда вы вызываете sum(5), создается новая область видимости с переменной total = 5 и возвращается innerFunc, которая “помнит” эту total. Когда вы вызываете (10), innerFunc обновляет total до 15 и снова возвращает себя. Этот процесс продолжается до тех пор, пока вы не вызовете (), что завершит цепочку.

Описание задачи

Вам необходимо реализовать функцию sum, которая позволяет суммировать числа, передаваемые в нее последовательно через цепочку вызовов. Особенность функции в том, что она должна возвращать накопленную сумму только тогда, когда ее вызывают без аргументов.

Эта техника известна как каррирование (или частичное применение) и является мощным инструментом функционального программирования в JavaScript.

// Примеры работы функции:
sum(); // Вернет 0
sum(5)(); // Вернет 5
sum(5)(10)(); // Вернет 15
sum(5)(10)(15)(); // Вернет 30

Примеры

// Вызов без аргументов
sum(); // 0
 
// Один аргумент
sum(13)(); // 13
 
// Два аргумента
sum(5)(5)(); // 10
 
// Несколько аргументов
sum(10)(7)(41)(); // 58
 
// Работа с отрицательными числами
sum(10)(-5)(); // 5

Требования

  • Функция должна называться sum.
  • Вызов sum() без аргументов должен возвращать 0.
  • Вызов sum(a)(b)...(n)() должен возвращать сумму всех переданных чисел.
  • Функция должна поддерживать произвольную длину цепочки вызовов.

🧑‍💻 Это не баг! Это фича!

Редактор кода намеренно скрыт на мобильном.

Поверь, так лучше: я оберегаю тебя от искушения писать код в неидеальных условиях. Маленький экран и виртуальная клавиатура — не лучшие помощники для программиста.

📖 Сейчас: Изучи задачу, продумай решение. Действуй как стратег.

💻 Потом: Сядь за компьютер, открой сайт и реализуй все идеи с комфортом. Действуй как код-джедай!