MonadPlus と guard 関数 

Scala の for 構文はフィルタリングができる:

scala> for {
         x <- 1 |-> 50 if x.shows contains '7'
       } yield x
res40: List[Int] = List(7, 17, 27, 37, 47)

LYAHFGG:

MonadPlus は、モノイドの性質をあわせ持つモナドを表す型クラスです。

以下が MonadPlus の型クラスのコントラクトだ:

trait MonadPlus[F[_]] extends Monad[F] with ApplicativePlus[F] { self =>
  ...
}

Plus、PlusEmpty、と ApplicativePlus 

これは ApplicativePlus を継承している:

trait ApplicativePlus[F[_]] extends Applicative[F] with PlusEmpty[F] { self =>
  ...
}

そして、それは PlusEmpty を継承している:

trait PlusEmpty[F[_]] extends Plus[F] { self =>
  ////
  def empty[A]: F[A]
}

そして、それは Plus を継承している:

trait Plus[F[_]]  { self =>
  def plus[A](a: F[A], b: => F[A]): F[A]
}

Semigroup[A]Monoid[A] 同様に、Plus[F[_]]PlusEmpty[F[_]] はそれらのインスタンスが plusempty を実装することを要請する。違いはこれが型コンストラクタ (F[_]) レベルであることだ。

Plus は 2つのコンテナを連結する <+> 演算子を導入する:

scala> List(1, 2, 3) <+> List(4, 5, 6)
res43: List[Int] = List(1, 2, 3, 4, 5, 6)

MonadPlus 再び 

MonadPlusfilter 演算を導入する。

scala> (1 |-> 50) filter { x => x.shows contains '7' }
res46: List[Int] = List(7, 17, 27, 37, 47)