https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCfBV%2FbtrGJFIfA1Y%2FPRKYYW8W2DAJAvkJEPFG51%2Fimg.jpg

함수 조합은 작은 기능을 하는 여러 함수를 pipe나 compose라는 이름의 함수로 조합하여 조금씩 더 의미 있는 함수로 만들어 가는 코드 설계 기법이다. 이번 장은 함수 조합의 토대가 되는 고차 함수와 커리, 그리고 이들을 이용한 함수 조합에 간해 살펴보자.

8**-1 함수형 프로그래밍이란?**

함수형 프로그래밍은 순수 함수와 선언형 프로그래밍의 토대 위에 함수 조합과 모나드 조합으로 코드를 설계하고 구현하는 기법이다.

함수형 프로그래밍은 다음 세 가지 수학 이론에 기반을 두고 있다.

함수형 프로그래밍 언어는 정적 타입, 자동 메모리 관리, 계산법, 타입 추론, 일등 함수에 기반을 두고, 대수 데이터 타입, 패턴 매칭, 모나드, 고차 타입 등의 고급 기능을 제공한다. 하지만, 함수형이라고 해서 이러한 기능을 모두 제공하지는 않는다.

타입스크립트는 함수형 언어에서 중요하게 여겨지는 패턴 매칭과 고차 타입이라는 기능을 생략함으로써 구문을 쉽게 만들었다. 하스켈이나 스칼라 같은 고급 함수형 언어들이 어렵게 느껴지는 이유는 패턴 매칭과 고차 타입 관련 구문들이 매우 복잡하기 때문이다. 이런 이유로 요즘 유행하는 코틀린이나 스위프트도 패턴 매칭 구문 정도만 있을 뿐 고차 타입 구문은 존재하지 않는다.

8**-2 제네릭 함수**

타입을 타입 변수 T로 표기할 때 이를 제네릭 타입이라고 한다. 타입스크립트의 함수는 매개변수와 반환값에 타입이 존재하므로, 함수 조합을 구현할 때는 제네릭 함수 구문을 사용해야 한다.

타입스크립트의 제네릭 함수 구문

제네릭 타입은 함수와 인터페이스, 클래스, 타입 별칭에 적용할 수 있으며, 꺾쇠 괄호 <>로 타입을 감싼 <T>, <T, Q>처럼 표현한다.

function g1<T>(a:T): void{}
function g2<T,Q>(a: T, b: Q): void{}

이처럼 제네릭 타입으로 함수를 정의하면 어떤 타입에도 대응할 수 있다.