Являются ли "каррирование" и "составление" одной и той же концепции в Javascript?

Недавно я прочитал о составе функций в Javascript-книге, а затем на веб-сайте я увидел, что кто-то ссылается на нее как currying.

Являются ли они одной и той же концепцией?

Ответ 1

@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 

Ответ 2

Состав и каррирование используются для создания функций. Состав и карри отличаются друг от друга тем, как они создают новые функции (применяя 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