Skip to content

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

References


  1. Monad_Programming_with_Scala_Future.pdf