JS каррирование – принцип функционального программирования
Каррирование в JavaScript
Каррирование (currying) в JavaScript - это техника функционального программирования, которая позволяет превращать функции с несколькими аргументами в цепочку функций с одним аргументом. При использовании каррирования, функции принимают один аргумент и возвращают новую функцию, которая затем принимает следующий аргумент и так далее.
Каррирование позволяет нам создавать более гибкие и модульные функции, так как они могут быть частично применены и повторно использованы. Дополнительные аргументы могут быть переданы позже, что упрощает композицию функций и улучшает их читаемость.
Рассмотрим простой пример функции сложения двух чисел:
function add(a, b) {
return a + b;
}
Чтобы применить каррирование к этой функции, мы можем использовать метод .bind():
const curriedAdd = add.bind(null, 5);
console.log(curriedAdd(3)); // Вывод: 8
Мы создали новую функцию curriedAdd, которая принимает только один аргумент b, а значение для a фиксировано на 5. Вызов curriedAdd(3) возвращает результат сложения 5 и 3, то есть 8.
Однако использование .bind() не всегда является удобным или элегантным. Здесь в игру вступает функциональное программирование и возможность написания кастомной функции каррирования.
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
};
}
};
}
function add(a, b) {
return a + b;
}
const curriedAdd = curry(add);
console.log(curriedAdd(5)(3)); // Вывод: 8
Мы создали функцию curry, которая принимает функцию fn в качестве аргумента. Возвращаемая функция curried принимает все переданные аргументы в виде массива args. Если количество переданных аргументов достаточно для вызова исходной функции fn, то функция apply применяется к fn с текущими аргументами. В противном случае создается новая функция, которая объединяет текущие аргументы args с дополнительными аргументами args2 и вызывает curried с новым списком аргументов.
Используя эту функцию, мы можем теперь каррировать функции любой сложности:
function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = curry(multiply);
console.log(curriedMultiply(2)(3)(4)); // Вывод: 24
Также, каррированные функции можно использовать для создания новых функций путем частичного применения аргументов:
const double = curriedMultiply(2);
console.log(double(5, 6)); // Вывод: 60
Таким образом, каррирование является мощным инструментом функционального программирования в JavaScript, который позволяет создавать гибкие и модульные функции. Каррированные функции упрощают композицию функций и повышают их читаемость, обеспечивая более гибкое использование аргументов.