← Назад к вопросам

Реализовать функцию curry

2.0 Middle🔥 241 комментариев
#React#Браузер и сетевые технологии

Условие

Напишите функцию curry(fn), которая преобразует функцию с несколькими аргументами в последовательность функций с одним аргументом.

Требования

  1. Функция должна работать с функциями любой арности
  2. Каррированная функция должна накапливать аргументы
  3. Когда накоплено достаточно аргументов - вызвать оригинальную функцию

Примеры

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

const curriedSum = curry(sum);

curriedSum(1)(2)(3); // 6
curriedSum(1, 2)(3); // 6
curriedSum(1)(2, 3); // 6
curriedSum(1, 2, 3); // 6

Бонус

Добавьте поддержку placeholder для частичного применения аргументов.

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Задача на функцию curry демонстрирует функциональное программирование.

Решение 1: Базовый curry

function curry(fn) {
  const arity = fn.length;
  return function curried(...args) {
    if (args.length >= arity) {
      return fn(...args);
    }
    return (...nextArgs) => curried(...args, ...nextArgs);
  };
}

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

const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3));      // 6
console.log(curriedSum(1, 2)(3));      // 6

Как работает

  1. fn.length получает количество параметров
  2. Накапливаем аргументы через замыкание
  3. Когда достаточно - вызываем функцию
  4. Поддерживает смешанный стиль

Практический пример

function fetchAPI(baseURL, headers, endpoint, query) {
  const url = new URL(endpoint, baseURL);
  return fetch(url.toString(), { headers });
}

const curriedFetch = curry(fetchAPI);
const apiClient = curriedFetch("https://api.example.com")({
  Authorization: "Bearer token"
});

const getUsers = () => apiClient("/users");

Best Practices

  • fn.length для арности функции
  • Рекурсивные замыкания - основа работы
  • Типизация через conditional types
  • Тестировать все варианты вызова
  • Помнить о производительности замыканий

Для собеседования

  1. Начните с базовой версии
  2. Объясните механизм (замыкания, рекурсия)
  3. Покажите практический пример
  4. Обсудите типизацию
  5. Упомяните compose и partial

Итог: Базовый curry - простой и понятный. TypeScript версия для типизированного кода.