Главная Категории Контакты Поиск

Каррирование функций в JavaScript

Что такое каррирование и чем оно полезно.

JavaScriptFunctional programming ·30.05.2019·читать 2 мин 🤓·Автор: Alex Myzgin

Каррирование или карринг - процесс рефакторинга функции, способствующий получению аргументов по одному. Чтобы продемонстрировать это, мы будем использовать канонический пример функции добавления.

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 (четвертичной), и так далее. Таким образом, карринг можно описать как принятие многомерной функции и превращение её в ряд унарных функций.

Заключение

В функциональном программировании, карринг обычно более популярна, чем частичное применение. Преобразование функции в серию унарных функций делает исходную функцию очень гибкой, поскольку мы можем применить любое количество аргументов, в данный момент времени. Кроме того, карринг очень полезный, когда мы используем композицию.

Website, name & logo
Copyright © 2019. Alex Myzgin