Plus

Plus is similar to Semigroup, it actually is semigroup. Scalaz defines Plus[F[_]] trait with plus abstract method similar to append in Semigroup[F]. Where Semigroup deals with types Plus deals with higher Kinds.

def plus[A](a: F[A], b: => F[A]): F[A]

It also has semigroup method to convert Plus to Semigroup.

Scalaz offers <+> alias for plus function.

PlusEmpty

PlusEmpty is Plus with empty method. Scalaz defines it as PlusEmpty[F[_]] trait which extend Plus[F].

def empty[A]: F[A]

It also has monoid method to convert PlusEmpty to Monoid.

Scalaz offers mempty alias for empty function.

IsEmpty

Scalaz defines IsEmpty[F[_]] trait which extends PlusEmpty[F] and adds isEmpty method.

def isEmpty[A](fa: F[A]): Boolean

ApplicativePlus

ApplicativePlus is both Applicative and PlusEmpty.

Chris Stucchio wrote an article about handling failures with ApplicativePlus that’s helpful to read.

MonadPlus

MonadPlus is both Monad and PlusEmpty. Since this is a monad and it has plus and empty methods, we can derive some functions for MonadPlus also.

def filter[A](fa: F[A])(f: A => Boolean) = bind(fa)(a => if (f(a)) point(a) else empty[A])

filter will lift A if predicate returns true and will return empty otherwise. There is also withFilter alias for filter method.

def unite[T[_], A](value: F[T[A]])(implicit T: Foldable[T]): F[A] =
  bind(value)((ta) => T.foldMap(ta)(a => point(a))(monoid[A]))

Which takes foldable monad and it folds it into monad. Since MonadPlus is a monoid and T[A] is foldable, foldMap can be used here.