더 안전한 프로그램을 작성하는 방법을 찾는 프로그래머에게는 순수 함수와 순수 효과를 명확히 구분하고 절대 서로 섞어 사용하지 않는다는 것이 궁극적인 목표가 아니다. 순수 함수는 테스트하기 쉽지만 순수 효과는 그렇지 않다. 그렇다면 순수 효과를 테스트하기 쉽게 바꿀 수 있을까? 그렇다. 효과를 기존과 다른 방식으로 다루면 테스트하기 쉬워진다. 함수형 프로그래밍이 효과를 다른 방식으로 다루는 프로그래밍 패러다임이다. 함수형 프로그래밍에서는 모든 것이 함수다. 값도 함수이고, 함수도 함수며, 효과도 함수다. 함수형 프로그래머는 효과를 적용하는 대신에 아직 평가되지 않은 형태로 의도한 효과를 표현하는 데이터를 반환하는 함수를 사용한다.1 이런 프로그래밍 패러다임에서는 데이터와 함수의 구분이 없기 때문에 모든 것이 함수고 데이터다.
순수한 함수형 프로그래밍을 사용하지 않는 이유는 뭘까? 순수한 함수형 프로그래밍을 사용할 수는 있지만 이를 위해 특별히 정의된 언어를 사용하지 않는다면 순수한 함수형 프로그래밍이 어려운 경우가 자주 있다. 자바나 코틀린 같은 언어는 함수형 프로그래밍 기법을 적용한 도구를 다수 제공한다. 하지만 함수형 효과는 제한적으로 지원한다. 12장에서는 함수형으로 효과를 처리하는 기법을 설명하는데, 이 기법은 프로그래밍의 유형과 관계없이 사용할 수 있다(심지어 프로그래머들은 이 기법을 사용하는지 미처 깨닫지 못한 채 이를 사용하는 경우도 있다). 하지만 이 기법을 사용할 수 있고 때로 꼭 사용해야 하는 경우도 있겠지만, 항상 효과를 12장에서 설명하는 방식으로 다루려 해서는 안 된다.
이 장에서는 순수 함수를 계산에 사용하는 방법과 커리한 함수(curried function)를 사용하는 방법을 배운다. 이 장에서 소개하는 코드 중 일부는 이해하기 어려울 수 있다. 이런 어려움은 이 장에서 List, Option 등의 다른 함수형 구조를 사용하지 않고 함수를 소개해 생기는 당연한 어려움이다. 이 장에서 설명을 하지 않은 내용은 나중에 설명하니 조금만 참기 바란다.
1 역주 자세히 설명하기에는 너무 복잡한 주제다. 하스켈에서 입출력을 표현하는 IO 타입에 대한 우리말 문서인 https://wikidocs.net/1566을 보면 이런 접근 방법에 대한 감이 약간 올 것이다. 코틀린을 약간 아는 독자라면 12장의 IO를 봐도 좋다.