Monad
Comment
Functor는 기존 문맥의 의미를 보존한다. 위의 예를 가지고 설명하자면, functor는 String형을 Int형으로 포장했으면, 결과도 Int형으로 된다. 다른 type으로 전환하지 못한다.
반면 Monad는 다른 type으로 전환할 수 있다. String형을 Int형으로 포장하여 연산(또는 함수)에 적용한 다음, Double형으로 결과물을 출력할 수 있다.
Monad는 어떻게 보면, C에서 말하는 cast같은 역할을 한다고도 할 수 있다.
Monad Laws
하스켈과 OCaml의 모나드 접근 방식 비교
Haskell의 모나드: 우아한 추상화
- 모나드는 단순히 Promise와 유사한 개념이 아닌 강력한 추상화 도구
- Monad 타입클래스를 통해 다양한 컨텍스트(Maybe, [], IO, State)에서 코드 재사용
- 제네릭 함수(예: sequence, mapM)가 모든 모나드에서 활용 가능
- do 표기법으로 가독성 높은 코드 작성 가능
- 하나의 패턴으로 다양한 계산 맥락을 일관되게 표현
OCaml의 다른 접근법: 실용주의
- 타입클래스 대신 모듈 시스템과 함수자 사용
- 문법적 지원(예: do 표기법) 부재로 모나드 코드가 더 장황함
- 직접적인 부수 효과 허용으로 모나드가 필수적이지 않음
- option, result 타입의 직접 사용과 모듈 수준 추상화 선호
- 지역적으로 이해하기 쉬운 코드 작성 가능
언어 설계 철학의 차이
- Haskell: 순수 함수형으로 효과 관리를 위해 모나드 필수
- OCaml: 부수 효과 허용으로 더 직접적인 코드 작성 가능
- 추상화, 명시성, 타입 시스템의 역할에 대한 철학적 차이
- Haskell은 일관성과 추상화, OCaml은 명확성과 실용성 강조
결론적 견해
- Haskell의 일관된 추상화 방식이 복잡한 시스템에서 특히 매력적
- OCaml의 직접적 접근법은 즉각적인 이해가 중요한 상황에서 유용
- 타입클래스와 문법적 지원이 하스켈에서 특별히 우아한 코드 구조화 가능
- 두 접근법 모두 각자의 장점이 있으며 상황에 따라 적절한 선택 필요
See also
Favorite site
- [추천] 제멋대로 Functor, Monad & Arrow 개념
- Monad는 무엇인가
- 모나드 괴담 - 키노루 - 2015년 11월 14일
- 스칼라 초중급자를 위한 모나드 해설(1)
- [추천] Monad Programming with Scala Future 1
- 1 모나드 이해하기 - WikibooksHaskell
References
-
Monad_Programming_with_Scala_Future.pdf ↩