[JS] 함수합성(Function Composition)

K00·2023년 3월 2일
0
post-thumbnail

1. 함수 합성(Function Composition)이란?

함수 합성(Composition)은 하나 이상의 함수를 조합하여 새로운 함수를 만드는 것을 말함. JavaScript에서 함수 합성은 다른 함수를 인자로 받아들이고, 새로운 함수를 반환하는 고차 함수를 사용하여 구현한다.

예제 1

function addOne(x) {
  return x + 1;
}

function double(x) {
  return x * 2;
}

addOne(double(4)); // 10

addOne() 함수와 double() 함수를 합성하였다.

2. 명시적으로 합성해주는 함수 compose()와 pipe()

compose() 함수 만들기

함수를 좀 더 명시적으로 합성해주는 함수 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);

pipe() 함수 만들기

그런데 우리가 만든 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);

Reference

자바스크립트 함수 합성, 뭐가 그렇게 대단할까?

FP in JS (자바스크립트로 접해보는 함수형 프로그래밍) - 함수 컴포지션, 커링

0개의 댓글