Questa domanda è simile alla domanda pubblicata su Groovy chiama l'applicazione parziale " currying '? , ma non completamente lo stesso, e le risposte fornite non mi soddisfano davvero.
Vorrei esporre a questo punto, prima di andare oltre, che il curriculum è uno dei concetti che sono stati difficili da comprendere appieno. Penso che la ragione di ciò sia il fatto che sembrano esserci due definizioni generali di curry, e in realtà non significano la stessa cosa sia in teoria che in applicazione.
Detto questo, penso che il curry sia un concetto molto semplice una volta che si decide di prendere solo una delle due definizioni e attenersi ad essa. In effetti, il curry non dovrebbe essere difficile da capire, ma secondo la mia esperienza, capire il curry è stato l'equivalente di mostrare a un ragazzino una mela e dirgli che il frutto si chiama mela, e poi vai a chiamare quel frutto un'arancia . Il ragazzo non capirà mai il semplice concetto di una mela perché hai causato un'enorme quantità di confusione definendo la mela un'arancia.
La definizione di curring che ho accettato come quella giusta è che il curry sta assumendo una funzione di arbitraria arità e trasformandolo in più funzioni concatenabili, ognuna delle quali accetta solo un parametro (funzioni unarie). Nel codice, sarebbe simile a questo:
f(1,2,3);
//becomes
f(1)(2)(3);
Tuttavia, alcune persone, inclusi i ben noti programmatori come John Resig, spiegano che il curry è qualcosa di completamente diverso. Per loro, il curry non è altro che una semplice applicazione parziale. C'è anche una funzione javascript generalmente accettata per la scrittura:
Function.prototype.curry = function() {
var fn = this, args = Array.prototype.slice.call(arguments);
return function() {
return fn.apply(this, args.concat(
Array.prototype.slice.call(arguments)));
};
};
Questa funzione non fa realmente curry, ma applica parzialmente gli argomenti forniti. Il motivo per cui non penso che questa funzione sia al limite, perché si può finire con una funzione che accetta più di un argomento:
var f2 = f.curry(1); //f accepts 3 arguments f(1,2,3);
f2(2,3); // calling the resulting "curried" function.
Quindi, la mia domanda è: ho frainteso il curriculum o no?
Vi lascerò con questo post che spiega il currying in javascript, ma in un modo in cui non vedo alcun curriculum: link