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)は引数なしのコンストラクタか、ファクトリメソッドだよ。
って書いてあった。
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記法)にいろいろな意味を持たせられる、という点では似てる気はするけど・・・。