Monad는 무엇인가

모나드는 하스켈의 성공(?)과 함께 다른 언어에도 유행처럼 퍼져나갔다. 하지만 그 배경이 되는 이론이 너무 복잡하고 수학적이라 많은 사람이 하스켈을 맛만 보다 떠나게 된 이유가 되었고, 다른 언어들에서도 모나드라는 것은 금지어가 되다시피 하였다.

하지만 어렵다고 모른 채로 살기에는 모나드는 너무 유용하다. 아니 유용한 정도가 아니라 이미 많은 곳에 사용되고 있다.

그리고 사실 모나드는 쉽다. 아니 어렵긴 어렵다. 그 배경 지식인 카테고리 이론은 어려운 것 맞다. 하지만 그걸 알 필요 없다. 언제는 프로그래머들이 함수가 무엇인지 수학적으로 이해하고 사용하였나? 카테고리론을 이해하지 못해도 모나드는 얼마든지 사용할 수 있다.

이제 슬슬 모나드가 무엇인지 궁금해졌을 것이다. 이쯤에서 한 문장으로 정리해서 설명했으면 좋겠지만, 아쉽게도 그건 좀 어렵다. 아마 이런 모습도 사람이 모나드를 이해하기 어려워하는 이유일 것이다. 그래도 최대한 풀어서 설명하면 모나드는 다음과 같다.

모나드는 다른 타입을 인자로 받는 타입이다.

모나드는 타입이다. 기본적으로 모나드는 int나 string 같은 타입이다. 다른 점이 있다면, 모나드는 타입을 인자로 받는다. C++에 익숙한 사람이라면, template class를 다른 generic class를 지원하는 언어에 익숙한 사람이라면 generic class를 생각하면 된다. 편의에 따라 앞으로 T라는 타입을 받은 모나드 MM[T]라고 표현하겠다.

모나드 타입의 값을 생성하는 함수가 있어야 한다.

모나드는 임의 타입의 값을 받아서 그 타입을 인자로 받은 모나드 타입의 값을 반환하는 함수가 있어야 한다. 다시 말하면, T 타입의 값을 받아서 M[T] 타입의 값을 반환하는 함수가 있어야 한다. 이는 하스켈에서 return operator라고 불리는 함수이다. 혹은 unit operator라고 부른다.

다른 모나드 타입으로 진행하는 함수가 있어야 한다.

이는 하스켈에서는 >>=라고 쓰이는 함수다. 이 함수는 M[T] 타입의 모나드가 있을 때, T 타입의 변수를 받아 M[U] 타입의 모나드를 반환하는 함수를 받아서, M[U] 타입의 값을 반환하는 함수다. 이 함수를 통해서 모나드에서 다른 모나드로 진행할 수 있다. 보통 bind operator라고 부른다.

정리하면, 모나드가 되기 위해서는 다음의 3가지 조건을 만족해야 한다.

  1. 타입을 인자로 받는 타입이다.
  2. unit operator가 있어야 한다.
  3. bind operator가 있어야 한다.

위의 3가지 조건을 만족하는 타입을 모나드라고 부른다. 사실 수학적으로 따지려면 몇가지 성질을 더 만족해야 한다. 하지만 그건 어디까지나 수학적으로 그렇다는 것이다. 프로그래머가 사용하기 위해서는 위의 수준으로 이해해도 사용하는데 큰 문제 없다.

모나드가 무엇인지 설명하였지만, 추상적인 내용이라서 모나드가 무엇이고, 어떻게 사용되며, 어떤 장점이 있는지 잘 감이 안 올 것 같다. 그래서 다음 글에서 모나드가 어떻게 사용되는지를 통하여 좀 더 구체적으로 알아보도록 하겠다.

댓글

댓글 쓰기

이 블로그의 인기 게시물

USB 2.0 케이블의 내부 구조

[C++] enum class - 안전하고 쓰기 쉬운 enum

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Web] SpeechSynthesis - TTS API

[Python] cache 데코레이터로 최적화하기