인터넷에서 다른 사람들의 카레에 대한 예가 카레가 아니라 실제로는 부분적으로 만 적용된다는 다양한 불만이 있습니다.
부분 적용이 무엇인지, 그리고 카레와 어떻게 다른지에 대한 적절한 설명을 찾지 못했습니다. 일반적인 혼동이있는 것 같습니다. 어떤 곳에서는 동등한 예가 카레로 묘사되고 다른 곳에서는 부분적으로 적용됩니다.
누군가 나에게 두 용어의 정의와 그 차이점에 대한 세부 정보를 제공 할 수 있습니까?
답변
카레는 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