Menu


C#とScalaのモナド

『モナドの驚異』にアクセスが多いようなので、便乗してモナドの記事を書いてみる。

Haskellのdo記法に当たる構文糖衣

C#ではLINQのクエリ構文が用意されている。Scalaの場合はfor式だ。

C#のクエリ構文は、SelectメソッドまたはSelectManyメソッドの呼び出しに機械的に置き換えられる。Scalaのfor式は、mapメソッドやflatMapメソッドの呼び出しに機械的に置き換えられる。 それらのメソッドが見つからないときは、クエリ構文やfor式はコンパイルエラーになる。

C#のSelectManyはmapとbind (>>=) が合成されたような形をしているが、ScalaのflatMapはbind (>>=) そのものだ。

Haskellのdo記法にはreturmは必須ではない。returnはモナドを返す単なる関数であり、別に使わなくてもdoの最後にモナドがあれば問題ない。 たとえば、printは Show a => a -> IO () のようにIOモナドを返すので、こう書ける。

C#のクエリ構文はselectが必須だし、Scalaのモナディックなfor式で値を返す時にはyieldが必須なので、Haskellのようには書けない。

Last Update: 2014-03-03 08:02:20