Что такое каррирование функций (каррирование)
Определение из Википедии:
В компьютерных науках каррирование (англ. 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
-
partialФункции могут помочь нам сгенерировать частичную функцию. - передача
partialfunction генерирует частичную функцию и присваивает ееparMulti, который устанавливает значение1. -
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. Частичные функции помогают нам добиться повторного использования кода, устанавливая предустановленные значения.
Суммировать
И каррирование, и частичные функции — это методы, используемые для преобразования функций с несколькими параметрами в функции, принимающие меньше параметров. После передачи некоторых параметров функцию в промежуточном состоянии можно повторно использовать как фиксированное значение. Но разница в том, что:
- Каррирование — это преобразование функции в несколько вложенных унарных функций, то есть каждая функция принимает только один параметр.
- Частичная функция может принимать более одного параметра, она фиксируется некоторыми параметрами в качестве предустановки и может принимать остальные параметры.