Ответ 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