
kits.MonadPlus.scala Maven / Gradle / Ivy
The newest version!
package kits
trait MonadPlus[F[_]] extends Monad[F] { F =>
def zero[A]: F[A]
def plus[A](x: F[A], y: F[A]): F[A]
def filter[A](fa: F[A])(p: A => Boolean): F[A] = flatMap(fa)(a => if (p(a)) pure(a) else zero)
def monoid[A]: Monoid[F[A]] =
new Monoid[F[A]] {
val empty: F[A] = F.zero[A]
def append(x: F[A], y: F[A]): F[A] = F.plus(x, y)
}
}
object MonadPlus extends MonadPlusFunctions[MonadPlus]
trait MonadPlusFunctions[T[F[_]] <: MonadPlus[F]] extends MonadFunctions[T] {
def plus[F[_], A](x: F[A], y: F[A])(implicit F: T[F]): F[A] = F.plus(x, y)
def filter[F[_], A](fa: F[A])(p: A => Boolean)(implicit F: T[F]): F[A] = F.filter(fa)(p)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy