2016-03-29 14 views
10

Ostatnio czytałem o składzie funkcji w książce Javascript, a następnie na stronie internetowej widziałem, jak ktoś nazywa to currying.Czy "curry" i "kompozycja" to ta sama koncepcja w JavaScript?

Czy to ta sama koncepcja?

+3

są to pojęcia pokrewne, ale niekoniecznie takie same. Komponowanie polega na tym, aby utworzyć dwa w jednym, aby curry stanowiło część wstępną. – dandavis

+0

@dandavis, czy możesz opublikować odpowiedź opisującą różnice? Czy można je wykorzystać do osiągnięcia tego samego celu? –

+0

zostało już dobrze wytłumaczone w wystarczającej ilości miejsc, w których nie udałoby mi się osiągnąć sprawiedliwości. ale w skrócie: nie są one takie same, więc uczyć się każdego i dowiedzieć się, co każdy oznacza i robi, aby dowiedzieć się, jak odnoszą się do siebie nawzajem, jeśli tak. – dandavis

Odpowiedz

14

@ odpowiedź Omarjmh jest dobra, ale komponować przykładem jest zdecydowanie skomplikowane dla uczącego się, moim zdaniem

Czy to ta sama koncepcja?

nr

pierwsze Zmiękczanie przekłada funkcji, które ma wiele argumentów do sekwencji funkcji każda przyjmowania jednego argumentu.

// not curried 
const add = (x,y) => x + y; 
add(2,3); // => 5 

// curried 
const add = x => y => x + y; 
add(2)(3); // => 5 

Należy zwrócić uwagę na wyraźny sposób, w jaki stosowana jest funkcja curry, jeden argument na raz.


Po drugie, skład funkcji jest połączeniem dwóch funkcji w jedną, która po zastosowaniu zwraca wynik połączonych funkcji.

const compose = f => g => x => f(g(x)); 

compose (x => x * 4) (x => x + 3) (2); 
// (2 + 3) * 4 
// => 20 

Obie koncepcje są ze sobą ściśle powiązane, ponieważ odgrywają one dobrze ze sobą. Ogólna funkcja funkcji działa z jednorzędowymi funkcjami (funkcje, które przyjmują jeden argument), a funkcje curry przyjmują również tylko jeden argument (na aplikację).

// 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

Masz rację, wydaję to później, dzięki – JordanHendrix

2

Kompozycja i curry służą do tworzenia funkcji. Skład i curry różnią się sposobem tworzenia nowych funkcji (poprzez zastosowanie argumentów vs łańcuchowania).

redagowania:

redagowania należy zwrócić funkcję, która jest kompozycją z listy funkcji dowolnej długości. Każda funkcja jest wywoływana przy zwracanej wartości następnej funkcji. Możesz myśleć o komponowaniu jako przesuwaniu od prawej do lewej poprzez argumenty.

przykład:

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

Zmiękczanie:

zmiękczania jest sposobem konstruowania funkcje umożliwia częściowe stosowania argumentów danej funkcji.

Przykład:

var addOne = add(1); 
var addTwo = add(2); 

var addOneToFive = addOne(5); 
var addTwoToFive = addTwo(5); 

l(addOneToFive); //6 
l(addTwoToFive); //7 

JSBin z powyższych przykładów: https://jsbin.com/jibuje/edit?js,console

Powiązane problemy