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 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.


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

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


ApplicativePlus is both Applicative and PlusEmpty.

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


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.