카레와 부분 적용의 차이점은 무엇입니까?


438

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

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

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

답변:


256

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

40
부분 적용은 함수를 카레하고 일부 기능을 사용하지만 일부 기능은 사용하지 않는다고 말하는 것입니까?
SpoonMeiser

9
더 많거나 적습니다. 당신은 단지 인수의 부분 집합을 제공하는 경우, 당신은 인수의 나머지 부분을 받아들이는 기능을 다시 얻을 것이다
마크시다

1
함수 f (a, b, c, d)를 g (a, b)로 변경하면 부분 적용으로 간주됩니까? 아니면 커리 기능에 적용될 때만인가? 아쉽게도 죄송하지만 여기에 명시적인 답변을 기다리고 있습니다.
SpoonMeiser

2
@Mark : 나는 이것이 나에게 pedant를 가져 오는 개념 중 하나 일 뿐이라고 생각한다. 그러나 권위있는 출처에 대한 호소는 서로를 가리키는 것처럼 보이기 때문에 만족할만한 것이 거의 없다. Wikipedia는 권위있는 출처라고 생각하기는 어렵지만 다른 것을 찾기가 어렵다는 것을 알고 있습니다. 나는 우리가 언어의 세부 사항에 동의하거나 동의하지 않을 수 있는지 여부에 관계없이 우리가 말하는 것과 그것의 힘을 모두 알고 있다고 생각하면 충분합니다! :) 고마워 마크!
Jason Bunting

5
@JasonBunting, 첫 번째 의견과 관련하여 말한 내용은 디카 레잉 입니다. 카레는 다중 arg 기능을 입력으로 취하고 1-arg 기능 체인을 출력으로 반환합니다. 디커 링은 1-arg 함수 체인을 입력으로 사용하고 multi-arg 함수를 출력으로 반환합니다. stackoverflow.com/a/23438430/632951에서
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.