gimmesilver's blog

Agbird.egloos.com

포토로그



(번역)All About Monads Part 1 - 소개 하스켈 스프링노트

 소개

모나드란 무엇인가?

 모나드는  어떤 값들과 이 값을 처리하는 일련의 계산 과정을 구조화하는 방법이다. (하스켈) 프로그래머는 모나드를 사용하면 여러 개의 계산 과정을 순차적으로 기술하여 블럭을 조직하고 축적할 수 있다. 또한 여러 계산 과정을 결합하여 새로운 하나의 수식으로 만들어 처리할 수 있을뿐 아니라 프로그래머가 이 수식을 필요한 시점에 사용하기 위해 일일이 코딩을 할 필요가 없다.


 여러 수식을 결합하여 보다 복잡한 수식으로 만들때 모나드 방식으로 생각하면 유용하다. 예를 들어 여러분은 하스켈에 있는 Maybe 타입에 친숙할 지 모르겠다.


  1. data Maybe a = Nothing | Just a


 이 Maybe 타입을 이용하면 실패할 가능성이 있는 수식의 결과 타입을 표현할 수 있다. Maybe 타입을 통해 Maybe 타입의 값을 반환하는 수식들을 결합하기 위한 정책을 제시할 수 있다. 만약 어떤 수식 A의 결과에 의존하는 수식 B로 구성된 결합 수식(combined computation)이 있다면, 이 때 이 결합 수식은 수식 A나 B 중 하나가 Nothing 값을 가질 때 Nothing을 반환할 것이다. 또한 이 결합 수식은 수식 A와 B 모두 수행에 성공했을 때 A의 결과를 적용하여 계산된 수식 B의 결과값을 반환할 것이다.


 모나드중에는 입출력 작업을 수행하거나, 특정 상태를 갖거나, 여러개의 결과를 반환할 수 있는 수식들을 처리하기 위한 모나드들도 있다. 수식들을 결합하는데 사용되는 여러 가지 정책마다 각기 다른 타입을 가진 모나드들이 많이 있지만 그 중에도 특별히 유용하고 일반적인 모나드들이 몇몇 있으며 이들은 표준 하스켈 98 라이브러리에 포함되어 있다. 이들에 대해서는 PartII 에 기술되어 있다.


왜 우리는 모나드를 이해하기 위해 애써야 하는가?

 인터넷에 나와 있는 다른 모나드에 대한 글 대다수가 (모나드에 대한) 개념을 이해하는데 어렵다는 지적을 받고 있다. 그 이유는 모나드가 천성적으로 추상적인 속성을 갖고 있으며, 각 모나드 타입별로 - 그것의 정의는 무엇이고 어디에서 유용하게 사용할 수 있는지에 대한 정확한 설명을 하는데 있어 혼란을 줄 수 있는 - 몇가지 다른 특성을 가지고 있기 때문이다.


 하스켈에서 모나드의 주된 역할은 입출력 시스템이다. 하스켈에서 입출력을 처리할 때 반드시 모나드를 이해할 필요는 없다. 그러나 I/O 모나드를 이해하면 여러분은 보다 향상된 코딩 실력을 갖게 될 것이다.


 프로그래머들에게 있어 모나드는 구조적인 함수형 프로그래밍을 위한 유용한 도구이다. 모나드는 다음과 같은 세가지 유용한 속성을 가지고 있다.

  1. 모듈화(Modularity): 모나드를 사용하면 보다 단순한 수식들을 결합할 수 있고, 그 수식을 실제 계산이 수행되는(즉, 함수가 호출되는) 부분과 분리할 수 있다.
  2. 유연성(Flexibility): 모나드를 사용하면 그것을 사용하지 않았을 때보다 더 융통성있는 프로그램을 만들 수 있다. 왜냐하면 모나드를 사용하면 특정 방식으로 처리되는 수식들을 한군데로 정제할 수 있어 프로그램 전체에 걸쳐 이 수식들이 여기 저기에 퍼지는 것을 막을 수 있기 때문이다.
  3. 고립성(Isolation): 모나드를 사용하면 명령형 프로그래밍 방식으로 코딩된 부분을 함수형 프로그래밍 방식으로 코딩된 부분과 구조적으로 분리할 수 있다. 이렇게 하면 하스켈과 같은 순수 함수형 언어에서 부수효과(side-effect)나 - 참조 무결성에 위배되는 - 상태값들을 사용하고자 할 때 유용하다.


이들 각각의 특성에 대해서는 세부적인 모나드에 대한 설명부분에서 다시 다루도록 하겠다.



덧글

댓글 입력 영역