みどりねこ日記

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

Haskellのモナド(1)

Haskellモナドについて調べてたら、wikibooksの方に良さ気な解説が載ってましたので翻訳してみました。


「最初に、これをして、次にあれをして、そのあとに他のことをして。」というような論理的な順序が存在するプログラミングをしているときに、モナドは非常に役に立ちます。

例えば、パースをするときに、「最初に、文字列の頭がifというキーワードかどうかをチェックしよう。もしそうなら、条件式を探して、そのあとthenキーワードを探して、そのあと式を探して、そのあとelseキーワードを探して、式を探そう。」と考えたとします。

他の例としては、「最初に、”Greeting, my friend.”と画面に出力したあと、改行して、"> "と出してキーボードの入力を待つ」というようなプログラムも考えられますね。

他には「最初に、データの塊を探して、もしあったら、他のデータの塊も探す。最終的に、それらの塊同士を結合して返す。もしデータがちゃんと取得できたなら、"Just データ"の形で返して、もしどれかの段階で失敗していた場合は、"Nothing"と返す。」というようなプログラムを考えたとします。

これらの3つの例は全く違う動作をします。最初の例は入力されたトークンを読み込んで、それによって影響され、2つ目の例はユーザに対して応答をするプログラムで、そして最後の例は、失敗する可能性のある処理を行おうとしています。しかし、これらには、それぞれ「何かを連続的に行う」という唯一の共通点があります。この、連続して何かを行うということが、モナドの心臓に当たります。

モナドの大事なこととして、「これをしてから、アレをしなさい」と書いたときの大体において、「これ」が「アレ」の前に必ずしも実行される必要はないということがあります。いくつかのモナドは、実行時において「アレ」が「これ」の前に実行されるか、またはそれらが順番に依存しないように改変してくれます。問題は、プログラムを書いているプログラマが、特定の順番で実行が行われるように考えていたいということです。

モナドは非常に汎用的なものです。モナドは3つの機能を提供するだけです。

  • 「これのあと、アレをしなさい」という方法
  • 「これをしなさい」という方法(あと、「これ」を実行中に望まない何かが起きた時、処理を失敗してくれるという機能)
  • 「これのあと、アレをしなさい」を実行する方法