Combine two F[A] values.
Combine two F[A] values.
Example:
scala> import cats.implicits._ scala> SemigroupK[List].combineK(List(1, 2), List(3, 4)) res0: List[Int] = List(1, 2, 3, 4)
Given a type A, create a concrete Semigroup[F[A]].
Given a type A, create a concrete Semigroup[F[A]].
Example:
scala> import cats.implicits._ scala> val s: Semigroup[List[Int]] = SemigroupK[List].algebra[Int]
"Compose" with a G[_]
type to form a SemigroupK
for λ[α => F[G[α]]]
.
"Compose" with a G[_]
type to form a SemigroupK
for λ[α => F[G[α]]]
.
Note that this universally works for any G
, because the "inner" structure
isn't considered when combining two instances.
Example:
scala> import cats.implicits._ scala> type ListOption[A] = List[Option[A]] scala> val s: SemigroupK[ListOption] = SemigroupK[List].compose[Option] scala> s.combineK(List(Some(1), None, Some(2)), List(Some(3), None)) res0: List[Option[Int]] = List(Some(1), None, Some(2), Some(3), None)
SemigroupK is a universal semigroup 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. Thus, SemigroupK is like a Semigroup for kinds (i.e. parametrized types).
A SemigroupK[F] can produce a Semigroup[F[A]] for any type A.
Here's how to distinguish Semigroup and SemigroupK: