curry,pipe, go는 연속해서 실행하는 함수 조합을 쉽게 만들어 줍니다. 하나씩 알아보도록 하겠습니다.
⚠️
주의
앞으로 map, filter, reduce와 같은 함수들을 사용할 예정입니다. 이 글에서는 앞선 함수들의 구현체는 언급하지 않을 예정입니다.
이 함수들은 함수를 첫 번째 인자로 받고, 배열을 두 번째 인자로 받는 형태로 사용할 것입니다.
예를 들어 arr.map(i=> i*2)는 map(i=>i*2 , arr)로 사용합니다.
curry
커링은 여러 개의 인자를 가진 함수를 하나의 인자만 받고 나머지 인자를 받는 새로운 함수를 반환하는 기법입니다. 예시를 들어보겠습니다.
function add(a: number, b: number) { return a + b;}function curriedAdd(a: number) { return (b: number) => a + b;}add(1, 2); // 3const addOne = curriedAdd(1);addOne(2); // 3
예시에서 add()는 두 개의 인자를 받아 더한 값을 반환합니다. 반면, curriedAdd()는 첫 번째 인자 a를 받고, 그 후에 클로저를 통해 두 번째 인자 b를 받아 a + b 를 계산하는 새로운 함수를 반환합니다. 이렇게 하면 curriedAdd()를 호출한 뒤 반환된 함수에 다음 피연산자를 전달하여 결과를 얻을 수 있습니다.
curry()는 여러 개의 인자를 가진 함수를 단일인자를 받아 나머지 인자를 받는 새로운 함수를 반환하는 curring 함수로 변경하는 헬퍼함수입니다.
콜백 함수의 시그니처가 사용처인 함수에서 요구하는 형식과 일치할때, 호출문을 생략할 수 있는 JS의 특성입니다.
예를 들어, arr.forEach(console.log)은 arr 배열의 각 요소를 console.log 함수에 전달하여 출력하는 동작을 수행합니다. 이 경우에는 console.log 함수가 forEach 함수에서 요구하는 콜백 함수의 형식과 일치하기 때문에 별도로 함수 선언이나 화살표 함수를 사용하지 않고도 간결하게 사용할 수 있는 것입니다.
pipe
pipe() 는 여러 함수를 차례대로 합쳐서 하나의 함수를 반환합니다. go()와 다르게 즉시 실행하지 않습니다.
export function pipe(f1: () => any, ...functions: any[]): any { return (): any => { return functions.reduce((value, func) => func(value), f1()); };}// go 함수를 사용해 나타내기도 합니다.const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs);
지금까지 알아본 헬퍼함수를 이용하면 보다 가독성 좋은 함수형 프로그래밍을 만들 수 있습니다.