Каррирование или карринг - процесс рефакторинга функции, способствующий получению аргументов по одному. Чтобы продемонстрировать это, мы будем использовать канонический пример функции добавления.
Currying
- это процесс получения функции, которая обычно получает более одного аргумента (такая как add
) и рефакторинга её так, что она становится функцией более высокого порядка. Карри-функция возвращает серию функций, каждая из которых принимает только один аргумент, и выполняет подсчет только после получения последнего аргумента.
// До
function add(x, y) {
return x + y;
}
// После
function add(x) {
return function(y) {
return x + y;
};
}
Если мы попытаемся использовать функцию add
обычным способом, передав оба аргумента одновременно, и выведем её в консоль, то увидим там функцию. Это происходит потому, что второй аргумент игнорируется, и мы получаем обратно функцию, которую возвращаем.
function add(x) {
return function(y) {
return x + y;
};
}
console.log(add(3, 4)); // ƒ (y) {return x + y}
Вместо этого мы можем сохранить, возвращаемую функцию как новую переменную. В этом случае, давай назовем её addWithThree
. Теперь можем взять нашу новую функцию и передать ей последний аргумент. Так как мы можем использовать эту функцию повторно, давай вызовем её несколько раз с разными аргументами и выведем в консоль. Каждая функция в функциональном программировании каррируется следующим образом:
function add(x) {
return function(y) {
return x + y;
};
}
const addWithThree = add(3);
console.log(addWithThree(5)); // 8
console.log(addWithThree(9)); // 12
console.log(addWithThree(29)); // 32
Мы можем написать наши карри-функции гораздо более лаконично, используя ES2015 стрелочные функции. Стрелочные функции неявно возвращают каждое выражение, которое идет после стрелки. В нашем случае мы возвращаем полную функцию после получения x
. После получения y
мы возвращаем сумму x + y
.
// ДО
function add(x) {
return function(y) {
return x + y;
};
}
// ПОСЛЕ (ES2015)
const add2 = x => y => x + y;
На этом этапе я хочу кратко обсудить некий жаргон. А именно слово arity
или арность. Arity
описывает количество аргументов, которые получает функция. В зависимости от количества, которое она получает, существуют определенные слова для описания этих функций.
Функция с одним аргументов - называется unary
(унарной) функцией. Функция, которая получает два аргумента, называется binary
(двоичной), три равняется ternary
(троичной), а четыре - quaternary
(четвертичной), и так далее. Таким образом, карринг можно описать как принятие многомерной функции и превращение её в ряд унарных функций.
Заключение
В функциональном программировании, карринг обычно более популярна, чем частичное применение. Преобразование функции в серию унарных функций делает исходную функцию очень гибкой, поскольку мы можем применить любое количество аргументов, в данный момент времени. Кроме того, карринг очень полезный, когда мы используем композицию.