2016-03-29 18 views
10

Recentemente ho letto sulla composizione delle funzioni in un libro Javascript, e poi su un sito Web ho visto che qualcuno lo citava come curriculum.In 'Javascript' e 'composizione' lo stesso concetto in Javascript?

Sono lo stesso concetto?

+3

sono concetti correlati, ma non esattamente uguali. comporre è fare due in uno, al curry è pre-definire una parte di uno. – dandavis

+0

@dandavis puoi pubblicare una risposta che illustri le differenze? Possono essere utilizzati per raggiungere lo stesso obiettivo? –

+0

è stato spiegato bene già in abbastanza posti che non riuscirei a farlo giustizia. ma in breve: non sono la stessa cosa, quindi studia ciascuno e capisce cosa ognuno di loro intende e fa, per capire come si applicano l'uno all'altro, se lo fanno. – dandavis

risposta

14

@ risposta di Omarjmh è buona, ma l'esempio di composizione è schiacciante complessa per uno studente, a mio parere

Sono lo stesso concetto?

No.

Innanzitutto, currying traduce una funzione che accetta più argomenti in una sequenza di funzioni, ciascuna accettando un argomento.

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

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

Si noti il ​​modo distinto in cui viene applicata una funzione al curry, un argomento alla volta.


In secondo luogo, la composizione di funzione è la combinazione di due funzioni in una, che quando viene applicata restituisce il risultato delle funzioni concatenate.

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

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

I due concetti sono strettamente correlati, come giocano bene uno con l'altro. La composizione di funzioni generiche funziona con funzioni unarie (funzioni che accettano un argomento) e le funzioni al curry accettano anche solo un argomento (per applicazione).

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

Hai proprio ragione, lo modificherò più tardi oggi, grazie – JordanHendrix

2

Composizione e curry vengono utilizzati per creare funzioni. La composizione e il curry differiscono nel modo in cui creano nuove funzioni (applicando args vs concatenamento).

composizione:

composizione dovrebbe restituire una funzione che è la composizione di una serie di funzioni di lunghezza arbitraria. Ogni funzione viene richiamata sul valore di ritorno della funzione che segue. Puoi pensare a comporre come spostarsi da destra a sinistra attraverso i suoi argomenti.

Esempio:

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:

Currying è un modo di funzioni che permettono parziale applicazione di argomenti di una funzione costruzione.

Esempio:

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

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

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

JSBin con gli esempi di cui sopra: https://jsbin.com/jibuje/edit?js,console

Problemi correlati