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 =>
...
}
これは 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[_]] はそれらのインスタンスが plus と empty を実装することを要請する。違いはこれが型コンストラクタ (F[_]) レベルであることだ。
Plus は 2つのコンテナを連結する <+> 演算子を導入する:
scala> List(1, 2, 3) <+> List(4, 5, 6)
res43: List[Int] = List(1, 2, 3, 4, 5, 6)
MonadPlus は filter 演算を導入する。
scala> (1 |-> 50) filter { x => x.shows contains '7' }
res46: List[Int] = List(7, 17, 27, 37, 47)