cats.MonoidK.scala Maven / Gradle / Ivy
The newest version!
package cats
import simulacrum.typeclass
/**
* MonoidK is a universal monoid which operates on kinds.
*
* This type class is useful when its type parameter F[_] has a
* structure that can be combined for any particular type, and which
* also has an "empty" representation. Thus, MonoidK is like a Monoid
* for kinds (i.e. parametrized types).
*
* A MonoidK[F] can produce a Monoid[F[A]] for any type A.
*
* Here's how to distinguish Monoid and MonoidK:
*
* - Monoid[A] allows A values to be combined, and also means there
* is an "empty" A value that functions as an identity.
*
* - MonoidK[F] allows two F[A] values to be combined, for any A. It
* also means that for any A, there is an "empty" F[A] value. The
* combination operation and empty value just depend on the
* structure of F, but not on the structure of A.
*/
@typeclass trait MonoidK[F[_]] extends SemigroupK[F] { self =>
/**
* Given a type A, create an "empty" F[A] value.
*
* Example:
* {{{
* scala> import cats.implicits._
* scala> MonoidK[List].empty[Long]
* res0: List[Long] = List()
* }}}
*/
def empty[A]: F[A]
/**
* Given a type A, create a concrete Monoid[F[A]].
*/
override def algebra[A]: Monoid[F[A]] =
new Monoid[F[A]] {
def empty: F[A] = self.empty
def combine(x: F[A], y: F[A]): F[A] = self.combineK(x, y)
}
override def compose[G[_]]: MonoidK[λ[α => F[G[α]]]] =
new ComposedMonoidK[F, G] {
val F = self
}
}