본문 바로가기

함수형 프로그래밍

함수형 자바스크립트 (5) - 함수 조합기

함수 조합기란 함수를 조합하여 제어 로직처럼 작동시킬 수 있는 고계 함수를 의미합니다. 이번에는 조합기들 중 가장 많이 사용되는 몇가지만 알아보겠습니다.

 

항등 (I-조합기)

항등 조합기는 주어진 인수와 똑같은 값을 반환합니다.

 

const identity = a => a

 

항등 조합기는 다음의 경우 사용됩니다.

  • 무인수 코드를 작성 할때, 함수 인수를 평가하는 시점에 데이터를 고계 함수에 제공
  • 함수 조합기의 흐름을 단위 테스트하면서 단순한 함수 결과에 대해 단언하고자 할 때
  • 캡슐화한 형식에서 데이터를 함수형으로 추출하고자 할 때

 

탭 (K-조합기)

탭 조합기는 코드 추가 없이 공형 함수(콘솔 로깅, HTML 페이지 쓰기)를 연결하여 합성할 때 유용합니다. 자신을 함수에 넘기고 자신을 돌려 받습니다.

 

const tap = fn => a => {fn(a); return a;}

 

함수를 받고 인자 a를 받아 함수에 a를 실행하고 다시 a를 리턴합니다. 

 

선택 (OR-조합기)

선택 조합기는 함수 호출시 기본 응답을 제공하는 단순 조건 로직을 수행합니다. 함수 2개를 인수로 받아 값이 있으면 첫 번째 함수의 결과를, 그렇지 않으면 두번째 함수의 결과를 반환합니다.

 

const alt = (fn1, fn2) => val => fn1(val) || fn2(val)

 

순차열 (S-조합기)

순차열 조합기는 함수 순차열을 순회합니다. 2개 혹은 그 이상의 함수를 인수로 받아 동일한 값에 대해 각 함수를 차례로 실행하는 함수를 반환합니다.

 

const seq = (...fns) => val => fns.forEach(fn => fn(val))

 

이를 이용하면 서로 연관되어 있지만 독립적인 일련의 연산을 수행할 수 있습니다. 순차열 조합기는 차례로 수행할 뿐 값을 반환하지는 않습니다.

 

포크(조인) 조합기

포크 조합기느 하나의 자원을 두가지 방법으로 처리후 그 결과를 다시 조합합니다.

 

const fork = (join, fn1, fn2) => val => join(fn1(val), fn2(val))

 

예를 들어 숫자 배열의 평균을 구하는 함수를 다음과 같이 짤 수 있습니다.

 

const divide = (x, y) => x/y

const sumArray = arr => arr.reduce((acc,val) => acc + val, 0)

const length = arr => arr.length

const getAverage = fork(divide, sumArray, length)

const numbers = [20, 30, 40, 60]

const average = getAverage(numbers)