Currying ist die Umwandlung einer einzelnen Funktion von n Argumente in n Funktionen mit jeweils einem einzigen Argument. Gegeben sei die folgende Funktion:
function f(x,y,z) { z(x(y));}
Wenn es als Curry zubereitet wird:
function f(x) { lambda(y) { lambda(z) { z(x(y)); } } }
Um die vollständige Anwendung von f(x,y,z) zu erhalten, müssen Sie dies tun:
f(x)(y)(z);
In vielen funktionalen Sprachen können Sie f x y z
. Wenn Sie nur anrufen f x y
o f(x)(y) dann erhalten Sie eine teilweise angewandte Funktion - der Rückgabewert ist eine Schließung von lambda(z){z(x(y))}
mit Übergabe der Werte von x und y an f(x,y)
.
Eine Möglichkeit, partielle Anwendungen zu verwenden, besteht darin, Funktionen als partielle Anwendungen von verallgemeinerten Funktionen zu definieren, z. B. falten :
function fold(combineFunction, accumulator, list) {/* ... */}
function sum = curry(fold)(lambda(accum,e){e+accum}))(0);
function length = curry(fold)(lambda(accum,_){1+accum})(empty-list);
function reverse = curry(fold)(lambda(accum,e){concat(e,accum)})(empty-list);
/* ... */
@list = [1, 2, 3, 4]
sum(list) //returns 10
@f = fold(lambda(accum,e){e+accum}) //f = lambda(accumulator,list) {/*...*/}
f(0,list) //returns 10
@g = f(0) //same as sum
g(list) //returns 10