Каррирование функций и частичное применение функций

JavaScript

Что такое каррирование функций (каррирование)


Определение из Википедии:

В компьютерных науках каррирование (англ. Currying), также переводимое как каррирование или гарринг, представляет собой преобразование функции, которая принимает несколько параметров, в функцию, которая принимает один параметр (первый параметр исходной функции). возвращает новую функцию, которая принимает оставшиеся аргументы и возвращает результат.

Другими словами, преобразовать функцию с n аргументами в n вложенных функций, каждая из которых принимает только один аргумент и возвращает новую функцию. то есть положитьf(a,b,c)превратиться вf(a)(b)(c).

 

пример


Например, функция принимает три параметра a, b, c и возвращает их произведение:

function multiply(a, b, c) {
    return a * b * c;
}

Чтобы запустить эту функцию, мы последовательно передаем 1, 2, 3 и возвращаем 6.

multiply(1,2,3); // 6

Давайте посмотрим, как это выглядит после каррирования:

function multiply(a) {
    return (b) => {
        return (c) => {
            return a * b * c
        }
    }
}
multiply(1)(2)(3) // 6

мы кладемmultiply(1,2,3)сталmultiply(1)(2)(3)форма. Каррирование функций осуществляется путем преобразования функции с несколькими аргументами в серию вложенных функций, каждая из которых, в свою очередь, принимает аргумент.

Или другой способ написания, который может быть легче понять:

function multiply(a) {
    return (b) => {
        return (c) => {
            return a * b * c
        }
    }
}
const mul1 = multiply(1);
const mul2 = mul1(2);
const result = mul2(3);  // 6

Функция умножения принимает параметр a, и мы передаем 1.mult1равныйmultiply(1)эквивалентно

(b) => {
    return (c) => {
        return a * b * c
    }
}

и принимает параметр b. И так далее,mul1(2)Передайте 2 и назначьте егоmult2равный

(c) => {
    return a * b * c
}

наконецmul2(3)вернутьa * b * c. Из-за особенностей замыкания сохраняются ранее переданные значения 1 и 2, и в итоге получается 6.

 

Применение функции каррирования


  • Каррированные функции предотвращают повторную передачу параметров и реализуют повторное использование.

Предположим, у нас есть функция, которая вычисляет объем трех объектов.

function volume(l, w, h) {
    return l * w * h;
}
volume(200,30,100) // 2003000
volume(32,45,100); //144000
volume(2322,232,100) // 53870400

Как видно из приведенного выше кода, если высота каждого объекта равна 100, нам нужно повторить проход три раза. Этого можно избежать, если вы используете каррированную функцию:

function volume(h) {
    return (w) => {
        return (l) => {
            return l * w * h
        }
    }
}

//固定高度
const itemHeight = volume(100);

//计算其他不同情况
itemHeight(30)(200); 
itemHeight(45)(32); 
itemHeight(232)(2322); 
  • состав функций

Простой код для синтеза двух функций выглядит следующим образом:

var compose = function(f,g) {
  return function(x) {
    return f(g(x));
  };
};

f(x)а такжеg(x)синтезируется какf(g(x)), существует скрытая предпосылка, что и f, и g могут принимать только один параметр, который использует каррирование функций.

 

Что такое частичное приложение


Частичное приложение (частичное приложение функции) легко спутать с каррированием функции, которое относится к взятию функции и применению ее к одному или нескольким параметрам, но не ко всем параметрам, в процессе создания новой функции эта функция используется для принятия остальные параметры. Это предложение непросто понять, посмотрите на следующий пример:

 

пример


function multiply(a,b,c){
    return a * b * c;
}
//生产偏函数的工厂
function partial(fn,a){
    return function(b,c){
        return fn(a,b,c);
    }
}

//变量parMulti接受返回的新函数
var parMulti = partial(multiply,1);

//在调用的时候传入剩余的参数
parMulti(2,3); // 6
  1. partialФункции могут помочь нам сгенерировать частичную функцию.
  2. передачаpartialfunction генерирует частичную функцию и присваивает ееparMulti, который устанавливает значение1.
  3. parMultiПринять остальные параметры2,3В сочетании с ранее установленным1получить окончательный результат.

 

Приложения частичных функций


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

function addition(x, y) {
   return x + y;
}
const plus5 = addition.bind(null, 5)
plus5(10) // output -> 15
plus5(20) // output -> 25

Передаем параметры заранее5, и возвращает новую функцию, назначеннуюplus5, эта функция может принимать остальные аргументы. передачаplus5Передайте остальные параметры10получить окончательный результат15, как в20предполагаемый25. Частичные функции помогают нам добиться повторного использования кода, устанавливая предустановленные значения.

 

Суммировать


И каррирование, и частичные функции — это методы, используемые для преобразования функций с несколькими параметрами в функции, принимающие меньше параметров. После передачи некоторых параметров функцию в промежуточном состоянии можно повторно использовать как фиксированное значение. Но разница в том, что:

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