Коротка відповідь
middleCurrying — це перетворення функції з кількома аргументами у послідовність однорядкових функцій, кожна з яких приймає один аргумент. Приклад: `const add = a => b => a + b; const addFive = add(5); console.log(addFive(3)); // 8`
Повне пояснення
Що це і навіщо Currying дозволяє створювати частково застосовані функції, що полегшує композицію та повторне використання коду. Це корисно в функціональному стилі, коли потрібна гнучкість у передачі параметрів.
Ключові принципи
- Функція повертає іншу функцію, яка приймає наступний аргумент.
- Кожна повернута функція може бути викликана окремо, зберігаючи контекст.
- Працює лише з синхронними функціями, але можна комбінувати з промісами.
Як це працює
- Вхідна функція приймає перший аргумент і повертає нову функцію.
- Новий виклик приймає другий аргумент і повертає результат або ще одну функцію.
- Процес повторюється, доки не будуть передані всі аргументи.
Практика і реалізація (JavaScript / TypeScript)
// Currying у TS з типами
function curry<A, B, C>(fn: (a: A, b: B) => C): (a: A) => (b: B) => C {
return a => b => fn(a, b);
}
const multiply = (x: number, y: number) => x * y;
const curriedMultiply = curry(multiply);
const timesThree = curriedMultiply(3);
console.log(timesThree(4)); // 12
Тестування
import { describe, it, expect } from 'vitest';
describe('curry', () => {
it('should return a curried function', () => {
const add = (a: number, b: number) => a + b;
const curriedAdd = curry(add);
expect(curriedAdd(2)(3)).toBe(5);
});
});
Оптимізація та edge cases
- Якщо функція приймає більше аргументів, можна розширити
curryдля довільної кількості. - Для асинхронних функцій можна використовувати
async/awaitу внутрішніх функціях.
Часті помилки
- Забудьте про контекст
thisу класах – використовуйте arrow-функції. - Не передавайте
undefinedяк аргумент, якщо функція не очікує. - Перевірте, що типи аргументів збігаються з очікуваними.
Follow‑up питання
- Як currying відрізняється від partial application?
- Чи можна застосувати currying до функцій, що повертають проміси?