Fetching contributors…
Cannot retrieve contributors at this time
53 lines (47 sloc) 1.47 KB
 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 } }
You can’t perform that action at this time.