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