답변:
카레는 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
또는 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