Semigroupal

Формальное определение

Semigroupal - это класс типов, который позволяет комбинировать контексты. Если есть два объекта типа F[A] и F[B], Semigroupal[F] позволяет объединить их для формирования объекта F[(A, B)]: product: (F[A], F[B]) => F[(A, B)] (также встречается название операции tuple2).

Semigroupal должен удовлетворять следующим законам:

Определение в виде кода на Scala

trait Semigroupal[F[_]]:
  def product[A, B](fa: F[A], fb: F[B]): F[(A, B)]

Примеры

"Обертка"

import cats.Id

given Semigroupal[Id] with
  override def product[A, B](fa: Id[A], fb: Id[B]): Id[(A, B)] = Id((fa, fb))

Option

given Semigroupal[Option] with
  override def product[A, B](fa: Option[A], fb: Option[B]): Option[(A, B)] =
    (fa, fb) match
      case (Some(a), Some(b)) => Some((a, b))
      case _                  => None

Реализация

Реализация в Cats

import cats.Semigroupal
import cats.instances.option.*

Semigroupal[Option].product(Some(123), Some("abc")) // Some((123,abc))
Semigroupal.tuple3(Option(1), Option(2), Option(3)) // Some((1,2,3))

Ссылки: