Lean으로 하는 함수형 프로그래밍

5. 펑터, 애플리커티브 펑터, 모나드🔗

FunctorMonad는 둘 다 아직 타입 인자를 기다리고 있는 타입에 대한 연산을 설명합니다. 이를 이해하는 한 가지 방법은, Functor가 담긴 데이터를 변환할 수 있는 컨테이너를 설명하고, Monad가 부작용이 있는 프로그램의 인코딩을 설명한다는 것입니다. 하지만 이러한 이해는 불완전합니다. 결국 OptionFunctorMonad 둘 다에 대한 인스턴스를 가지며, 선택적 값을 나타냄과 동시에 값을 반환하지 못할 수도 있는 계산을 나타냅니다.

데이터 구조의 관점에서 볼 때, Option은 널 허용 타입(nullable type)이나 최대 하나의 항목만 포함할 수 있는 리스트와 다소 비슷합니다. 제어 구조의 관점에서, Option은 결과 없이 조기 종료될 수 있는 계산을 나타냅니다. 일반적으로 Functor 인스턴스를 사용하는 프로그램은 Option을 데이터 구조로 사용한다고 생각하는 것이 가장 쉽고, Monad 인스턴스를 사용하는 프로그램은 조기 실패를 허용하기 위해 Option을 사용한다고 생각하는 것이 가장 쉽습니다. 하지만 이 두 관점을 모두 능숙하게 사용하는 법을 익히는 것은 함수형 프로그래밍에 능숙해지는 데 중요한 부분입니다.

펑터와 모나드 사이에는 더 깊은 관계가 있습니다. 모든 모나드는 펑터라는 사실이 밝혀집니다. 다시 말해, 모든 펑터가 모나드인 것은 아니기 때문에 모나드 추상화가 펑터 추상화보다 더 강력하다고 할 수 있습니다. 또한, applicative functors(애플리커티브 펑터)라고 불리는 추가적인 중간 추상화가 있는데, 이는 많은 흥미로운 프로그램을 작성할 만큼 충분한 능력을 갖추고 있으면서도 Monad 인터페이스를 사용할 수 없는 라이브러리를 허용합니다. 타입 클래스 Applicative는 애플리커티브 펑터의 오버로드 가능한 연산을 제공합니다. 모든 모나드는 애플리커티브 펑터이고, 모든 애플리커티브 펑터는 펑터이지만, 그 역은 성립하지 않습니다.

  1. 5.1. 구조체와 상속
  2. 5.2. 애플리커티브 펑터
  3. 5.3. 애플리커티브 계약
  4. 5.4. 대안
  5. 5.5. 유니버스
  6. 5.6. 완전한 정의
  7. 5.7. 요약