cats.MonoidK.scala Maven / Gradle / Ivy
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. parameterized 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.
*/
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.combine(x, y)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy