柯里化是将单个函数转换为n论证成n每个函数都有一个参数。给定以下函数:
function f(x,y,z) { z(x(y));}
当柯里化时,变成:
function f(x) { lambda(y) { lambda(z) { z(x(y)); } } }
为了获得 f(x,y,z) 的完整应用,您需要这样做:
f(x)(y)(z);
许多函数式语言都可以让你编写f x y z
。如果你只打电话f x y
or f(x)(y)然后你得到一个部分应用的函数——返回值是一个闭包lambda(z){z(x(y))}
传入 x 和 y 的值f(x,y)
.
使用部分应用的一种方法是将函数定义为广义函数的部分应用,例如fold:
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