함수 합성(Composition)은 하나 이상의 함수를 조합하여 새로운 함수를 만드는 것을 말함. JavaScript에서 함수 합성은 다른 함수를 인자로 받아들이고, 새로운 함수를 반환하는 고차 함수를 사용하여 구현한다.
function addOne(x) {
return x + 1;
}
function double(x) {
return x * 2;
}
addOne(double(4)); // 10
addOne() 함수와 double() 함수를 합성하였다.
함수를 좀 더 명시적으로 합성해주는 함수 compose()를 만들어줄 수도 있다.
const compose = (func1, func2) => val =>func2(func1(val));
const compute = compose(addOne, double); // = double(addOne(val))
compute(4); //10
compose() 함수를 좀 더 유연하게 만들어 함수를 갯수 제한 없이 받을 수도 있다.
const compose = (...funcs) => (initialVal)
=> funcs.reduceRight((val, fn) => fn(val), initialVal);
/* 이 두 코드는 완전히 같다 */
multiply2(add2(multiply1(add1(2))));
compose(multiply2, add2, multiply1, add1)(2);
그런데 우리가 만든 compose() 함수는 맨 오른쪽 인자부터 실행된다. 이는 사람이 보기에 직관적이지 않다. 보통 왼쪽에서 오른쪽으로 가는 것이 정방향이기 때문이다. 이번에는 맨 왼쪽 인자부터 실행되는 pipe() 함수를 만들어보자.
const pipe = (...funcs) => (initialVal)
=> funcs.reduce((val, fn) => fn(val), initialVal);
//reduce 2번째 인수(argument)는 초기값(initialVal)임
/* 이 두 코드는 완전히 같다 */
multiply2(add2(multiply1(add1(2))));
pipe(multiply2, add2, multiply1, add1)(2);