6. Monad Transformers
모나드는 순수 언어에서 부수 효과의 모음을 인코딩하는 방법이다. 서로 다른 모나드는 상태나 오류 처리 같은 서로 다른 효과를 제공한다. 많은 모나드는 대부분의 언어에서 제공하지 않는 유용한 효과도 제공한다. 예를 들어 비결정적 탐색, 리더, 심지어 연속(continuation)도 있다.
일반적인 애플리케이션은 모나드 없이 작성해 쉽게 시험할 수 있는 핵심 함수들과, 필요한 애플리케이션 로직을 모나드로 인코딩하는 바깥 래퍼를 함께 가진다. 이 모나드는 잘 알려진 구성 요소로 만든다. 예를 들면 다음과 같다.
-
가변 상태는 같은 타입의 함수 매개변수와 반환 값으로 인코딩한다.
-
오류 처리는 성공·실패 생성자를 가진
Except와 비슷한 반환 타입으로 인코딩한다. -
로깅은 반환 값과 로그를 짝지어 인코딩한다.
그러나 각 모나드를 손으로 작성하면 여러 타입 클래스의 반복적인 정의가 필요해 지루하다. 각 구성 요소를 다른 모나드를 수정해 추가 효과를 더하는 정의로 추출할 수도 있다. 이런 정의를 모나드 변환기라고 한다. 구체적인 모나드는 모나드 변환기 모음으로 만들 수 있어 코드를 훨씬 더 많이 재사용할 수 있다.