みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellのモナド(2)

モナドHaskellにおいて非常に使い勝手のいい概念ですが、Haskell初心者には少々難しい概念でもあります。モナドには多くの機能があり、それ故、様々な人が別々の視点からモナドを説明するのでそれがモナドの汎用性に対する理解の混乱のもととなるのでしょう。

歴史的に見て、モナドHaskellで入出力を行うために導入されました。正格評価と比べ、遅延評価であるということは、どの順番で処理が実行されていくかが予測できない、つまりファイルの入出力などの操作が苦手であるということになります。したがって、処理の順番を示す方法が必要となり、モナドがその役にぴったりだったというわけです。

しかし、モナドは入出力のためだけに限定されているものではありません。モナドを利用することで、どの手続き型言語もモデリングすることが出来ます。モナドを選択することで、この言語のあるべき姿が見えてきます。例えば、例外をサポートするべきか、状態について、非決定性について、継続、コルーチン、…。確かにHaskellという言語自体はこれらすべてをサポートしているわけではありません。しかし、標準ライブラリによって実現されています。このため、モナディックな値はよく「アクション」とか「計算」などと呼ばれます。一般的に、アクションは特定の型の結果を返します。しかし、結果の値を返す必要があるかどうかはモナドによります。例えば、例外を投げるときは値を返しませんが、非手続き的な計算を行った場合、ひとつの値を返すのではなく、値のリストを返すことがあります。

これからしばらくMaybeモナドについて書いていきます。Maybeモナドは非常にシンプルな例外処理を行うためのモナドです。読者の方はおそらくIOモナドについても理解して、その後他のモナドにも視野を広げてゆきたいだろうと思いますので、リンクをいずれ貼っていきます。