Недавно я прочитал о составе функций в Javascript-книге, а затем на веб-сайте я увидел, что кто-то ссылается на нее как currying.
Являются ли они одной и той же концепцией?
Недавно я прочитал о составе функций в Javascript-книге, а затем на веб-сайте я увидел, что кто-то ссылается на нее как currying.
Являются ли они одной и той же концепцией?
@Omarjmh ответ хорош, но пример составления является чрезвычайно сложным для ученика, на мой взгляд.
Являются ли они одной и той же концепцией?
Нет.
Во-первых, currying - это перевод функции, которая принимает несколько аргументов в последовательность функций, каждая из которых принимает один аргумент.
// not curried
const add = (x,y) => x + y;
add(2,3); // => 5
// curried
const add = x => y => x + y;
add(2)(3); // => 5
Обратите внимание на то, каким образом применяется карриная функция, по одному аргументу за раз.
Во-вторых, композиция функций представляет собой комбинацию двух функций в одну, которая при применении возвращает результат цепочки функций.
const compose = f => g => x => f(g(x));
compose (x => x * 4) (x => x + 3) (2);
// (2 + 3) * 4
// => 20
Эти два понятия тесно связаны друг с другом, поскольку они хорошо сочетаются друг с другом. Состав общей функции работает с унарными функциями (функции, принимающие один аргумент), а в карриных функциях также принимается только один аргумент (для каждого приложения).
// curried add function
const add = x => y => y + x;
// curried multiplication function
const mult = x => y => y * x;
// create a composition
// notice we only apply 2 of comp 3 parameters
// notice we only apply 1 of mult 2 parameters
// notice we only apply 1 of add 2 parameters
let add10ThenMultiplyBy3 = compose (mult(3)) (add(10));
// apply the composition to 4
add10ThenMultiplyBy3(4); //=> 42
// apply the composition to 5
add10ThenMultiplyBy3(5); //=> 45
Состав и каррирование используются для создания функций. Состав и карри отличаются друг от друга тем, как они создают новые функции (применяя args vs chaining).
Создать:
Compose должен возвращать функцию, являющуюся композицией списка функций произвольной длины. Каждая функция вызывается для возвращаемого значения следующей функции. Вы можете думать о том, чтобы сочинять как движущиеся справа налево через свои аргументы.
Пример:
var compose = function(funcs) {
funcs = Array.prototype.slice.call(arguments, 0);
return function(arg) {
return funcs.reduceRight(function (a, b) {
a = a === null ? a = b(arg) : a = b(a);
return a;
}, null);
};
};
var sayHi = function(name){ return 'hi: ' + name;};
var makeLouder = function(statement) { return statement.toUpperCase() + '!';};
var hello = compose(sayHi, makeLouder);
l(hello('Johhny')); //=> 'hi: JOHNNY!'
Карринг:
Currying - это способ построения функций, допускающих частичное применение аргументов функций.
Пример:
var addOne = add(1);
var addTwo = add(2);
var addOneToFive = addOne(5);
var addTwoToFive = addTwo(5);
l(addOneToFive); //6
l(addTwoToFive); //7
JSBin с приведенными выше примерами: https://jsbin.com/jibuje/edit?js,console