이글루 냠냠

namelessja.egloos.com

포토로그



[javascript] 커링 Javascript

함수는 기본적으로 value를 리턴해주는 어떠한 기능 명세이며,
함수가 동작하기 위해서는 0개 이상의 인수를 필요로 한다.
커링은 이러한 인수를 함수와 결합하여 또다른 함수를 만들도록 한다.
조금 더 자세히 설명하면, 원하는 만큼의 인수의 수만큼 함수를 나누어 여러 단계의 다른 함수를 만들도록 한다.
수학적 수식으로는 f = (X x Y) -> z 의 커리 g를 수식화하면 g = X -> (Y -> Z) 란다...
..........문제는 이렇게 써놓으면 도저히 모르겠다는거지... -_-)
이제 또 늘상 하던 것 처럼 예제를 하나 만들어 볼까 한다.

예를들면 다음과 같은 기능을 하는 함수 sum이 있다고 가정한다.
var sum = function(a, b) {
return a+b;
}


그리고, javascript의 함수 프로토타입에 curry라는 메소드를 만든다.
javascript에는 기본적으로 커링 메소드를 제공하지 않기 때문에 function의 prototype에 curry라는 모듈을 만들었다.
Function.prototype.curry = function() {
var slice = Array.prototype.slice;
var args = slice.apply(arguments);
var that = this;
return function() {
return that.apply(null, args.concat(slice.apply(arguments)));
};
}


자 그리고 다음을 실행해 보도록 한다.
var sum1 = sum.curry(1);
console.log(sum1(5)); // 결과 : 6
console.log(sum1(3)); // 결과 : 4


왜 이런 결과가 나오냐면....
커리라는 건 먼저 전달받는 인수를 유지하고,
그 다음에 들어오는 인수들을 사용하여 실제 함수를 호출하는 거다.

일단, sum1은 sum을 커링한 커링함수가 되는데 이 함수는 sum을 호출할 때 첫 번째 인자로 1이라는 인자를 전달하게 된다.
그리고 처음 넘겨받게 되는 이 1이라는 인자는 클로저 형태로 지속적으로 바라보고 있어지게 된다.
클로저에 대해서는 [여기]를 참조하면 되겠다.

그리고, sum1(5)를 호출하게 되면, 2번째 인자로서 5가 들어간 sum이 호출된다.
위에 사용된 예제 sum1(5)의 의미는 sum(1, 5)이다.
그리고 sum1(3)의 의미는 sum(1, 3)이다.
즉, 인자로 넘어가 저장된 args에 1이 이미 저장되어 있고, 두 번째로 받는 인자가 이것과 합쳐져서 전달되므로,
위와 같이 호출되게 되는 것.

자 그럼 원래 수식으로 돌아가서...
원래 함수 f = (X x Y) -> Z는 X와 Y를 사용해서 Z를 추출하는 함수 f를 커리해보겠다
f(x, y) = r 일 때, f1(x) = g, g(y)= r가 되도록 정의한다.
여기에서 f1을 사용하면 본래의 f의 결과를 얻을 수 있게 된다. 이것을 커리라고 한다.

자 이 해설을 기반으로 위의 예제를 설명하면
일반함수 f는 sum(a, b)를 의미하고,
커리함수 f1은 sum1(b)를 의미하고,
커리함수를 얻을 수 있는 함수 g는 sum.curry(a)를 의미한다.

덧글

댓글 입력 영역