순수함수에 대해 이해했으니, 이제 currying에 대해 알아본다. 일반적으로 함수를 호출할 때 아래와 같이 호출한다.
func(a, b, c);
currying하면 아래와 같이 호출한다.
func(a)(b)(c);
호출하는 방식이 변하려면, 함수의 구조가 변경되어야 하는데. 아래와 같다.
function func(a, b, c) {
return a + b + c;
}
위 함수에 currying을 적용하면,
function func(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
이렇게된다.
어쩌면 currying을 적용한 함수가 가독성이 떨어진다고 볼 수도 있다. 그래서 자바스크립트에서 기본으로 제공하지는 않지만, currying을 적용할 수 있는 utility function을 만들어서 사용하는 방법도 있다.
function _curry(func) {
return function curried(...args) {
if (f.length !== args.length) {
return curried.bind(null, ...args);
}
return func(...args);
};
}
function add(a, b, c) {
return a + b + c;
}
add(1, 2, 3);
const curriedAdd = curry(add);
curriedAdd(1)(2)(3);
이런식으로 가능하다. 사실 가독성보다는 순수함수의 규칙을 지킨다는 것에 더 큰 의의가 있다고 생각한다. 다음에는 리액트에서 중요한 개념인 Higher-Order Component와 유사한 개념인 Higher-Order Function에 대해 알아보도록 하자.