5. Functors, Applicative Functors, and Monads
Functor와 Monad는 모두 타입 인수를 기다리는 타입에 대한 연산을 설명한다.
이를 이해하는 한 가지 방법은 Functor가 내부 데이터를 변환할 수 있는 컨테이너를, Monad가 부작용이 있는 프로그램의 인코딩을 설명한다고 보는 것이다.
그러나 이 이해만으로는 충분하지 않다.
실제로 Option은 Functor와 Monad 모두의 인스턴스를 가지며, 선택적 값 이면서 값을 반환하지 못할 수 있는 계산을 동시에 나타낸다.
자료구조의 관점에서 Option은 널 가능 타입이나 최대 하나의 항목만 담을 수 있는 목록과 비슷하다.
제어 구조의 관점에서 Option은 결과 없이 일찍 종료할 수 있는 계산을 나타낸다.
일반적으로 Functor 인스턴스를 사용하는 프로그램은 Option을 자료구조로 사용한다고 생각하는 것이 가장 쉽고, Monad 인스턴스를 사용하는 프로그램은 조기 실패를 허용하기 위해 Option을 사용한다고 생각하는 것이 가장 쉽다. 하지만 이 두 관점을 능숙하게 오가는 법을 배우는 것은 함수형 프로그래밍에 숙련되는 데 중요한 부분이다.
Functor와 Monad 사이에는 더 깊은 관계가 있다.
모든 Monad는 Functor임이 밝혀진다.
달리 말하면 모든 펑터가 모나드인 것은 아니므로 모나드 추상화가 펑터 추상화보다 강력하다.
더 나아가 Applicative functor라는 중간 추상화도 있다. 이는 흥미로운 프로그램을 많이 작성할 만큼 강력하면서도 Monad 인터페이스를 사용할 수 없는 라이브러리도 허용한다.
Applicative 타입 클래스는 애플리커티브 펑터의 오버로딩 가능한 연산을 제공한다.
모든 모나드는 애플리커티브 펑터이고 모든 애플리커티브 펑터는 펑터지만, 그 역은 성립하지 않는다.