Monad in Scala

Programming in Scala, Third Editionを読んでいたら、

Scalaのforはコンパイル時にmapとかfliterとかの関数呼び出しに展開されるよ。最終的に型があっていれば、mapとかの型に制限はないんだけど、以下のような型が一般的だよ。

// CはコレクションのC
class C[A] {
  def map[B](f: A => B): C[B]
  def flatMap[B](f: A => C[B]): C[B]
  def filter(p: A => Boolean): C[A]
  def foreach(b: A => Uint): Unit

最初の3つに注目するんだ。関数型言語にはモナドっていう概念があるんだけど、実はこの3つの関数、モナドの上に形式化できるんだ。ちなみに単位元(unit)は引数なしのコンストラクタか、ファクトリメソッドだよ。

って書いてあった。

とりあえずHaskellモナドの定義を貼っておきますね。

class Monad m where
  (>>=) :: m a -> (a -> m b) -> m b
  (>>) :: m a -> m b -> m b
  return :: a -> m a
  fail :: String -> m a
        -- Defined in GHC.Base

とりあえずボクには、この2つを対応づけられそうにない。たしかに、同じ記法(for記法/do記法)にいろいろな意味を持たせられる、という点では似てる気はするけど・・・。