← Назад к вопросам
Реализовать функцию curry
2.0 Middle🔥 241 комментариев
Условие
Напишите функцию curry(fn), которая преобразует функцию с несколькими аргументами в последовательность функций с одним аргументом.
Требования
- Функция должна работать с функциями любой арности
- Каррированная функция должна накапливать аргументы
- Когда накоплено достаточно аргументов - вызвать оригинальную функцию
Примеры
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
Как работает
- fn.length получает количество параметров
- Накапливаем аргументы через замыкание
- Когда достаточно - вызываем функцию
- Поддерживает смешанный стиль
Практический пример
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
- Тестировать все варианты вызова
- Помнить о производительности замыканий
Для собеседования
- Начните с базовой версии
- Объясните механизм (замыкания, рекурсия)
- Покажите практический пример
- Обсудите типизацию
- Упомяните compose и partial
Итог: Базовый curry - простой и понятный. TypeScript версия для типизированного кода.
Похожие вопросы
- Реализовать Promise.all
- Проверка строки на палиндром
- Реализовать функцию debounce
- Проверка двух строк на анаграмму
- Развертывание вложенного объекта в плоскую структуру
- Числа Фибоначчи с мемоизацией
- Создать React-компонент таблицы с сортировкой
- Создать компонент бесконечного скролла на React
- Создать адаптивное навигационное меню
- Найти уникальный элемент в массиве
- Глубокое клонирование объекта
- Реализовать бинарный поиск
- Самая длинная подстрока без повторений
- Максимальная сумма подмассива (алгоритм Кадана)
- Подсчёт гласных в строке
- Реализовать пользовательский хук useDebounce
- FizzBuzz
- Реализовать пользовательский хук useFetch
- Реализовать функцию pipe и compose
- Реализовать функцию throttle