[language-agnostic] 카레와 부분 적용의 차이점은 무엇입니까?

인터넷에서 다른 사람들의 카레에 대한 예가 카레가 아니라 실제로는 부분적으로 만 적용된다는 다양한 불만이 있습니다.

부분 적용이 무엇인지, 그리고 카레와 어떻게 다른지에 대한 적절한 설명을 찾지 못했습니다. 일반적인 혼동이있는 것 같습니다. 어떤 곳에서는 동등한 예가 카레로 묘사되고 다른 곳에서는 부분적으로 적용됩니다.

누군가 나에게 두 용어의 정의와 그 차이점에 대한 세부 정보를 제공 할 수 있습니까?



답변

카레는 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


답변