(今回のコードは github:everpeace/composing-monads にあります。) 一般に、モナドって合成できないって言われますよね。 でも、モナドって合成できる場合も有るんです。 今回はまず、合成が難しい(できない)理由を説明して、 じゃぁ「モナドが合成できる時」はいつなのか? というのと「合成できるモナドたち」をちょっとだけ紹介してみます。 それにはまず、ここから始めましょう。 モナドをflatMapじゃなくてflattenで定義してみる。 flatMapで定義されるモナドのおさらい Mというモナドは次の用に定義されます。 trait Functor[F[_]]{ def map[A,B](fa:F[A])(f:(A) => B):F[B] } trait Monad[M[_]] extends Functor[M]{ def unit[A](a:A):M[A] de