2016-03-29 16 views
10

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

Являются ли они одинаковыми понятиями?

+3

они связаны понятиями, но не совсем то же самое. сочинять - сделать два в одном, карри - предварительно определить часть единицы. – dandavis

+0

@ dandavis можете ли вы опубликовать ответ, в котором изложены различия? Могут ли они использоваться для достижения одной и той же цели? –

+0

было хорошо объяснено уже в достаточном количестве мест, что я не смог бы оправдать это. но вкратце: они не то же самое, поэтому изучайте каждого и выясняйте, что каждый из них означает и делает, чтобы выяснить, как они применяются друг к другу, если они это сделают. – dandavis

ответ

14

@ ответ Omarjmh это хорошо, но сочинять пример в подавляющем большинстве случаев сложны для обучающегося, на мой взгляд

Являются ли они одинаковыми понятиями?

Номер

Во-первых, карринг переводит функцию, которая принимает несколько аргументов в последовательность функций, каждая принимает один аргумент.

// 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's 3 parameters 
// notice we only apply 1 of mult's 2 parameters 
// notice we only apply 1 of add's 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 
+0

Вы очень правы, я отредактирую его позже сегодня, спасибо – JordanHendrix

2

Композиция и карри используются для создания функций. Состав и карри отличаются друг от друга тем, как они создают новые функции (применяя args vs chaining).

Compose:

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!' 

Каррирование:

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

Пример:

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