Semigroupal
Формальное определение
Semigroupal
- это класс типов, который позволяет комбинировать контексты.
Если есть два объекта типа F[A]
и F[B]
, Semigroupal[F]
позволяет объединить их для формирования объекта F[(A, B)]
:
product: (F[A], F[B]) => F[(A, B)]
(также встречается название операции tuple2
).
Semigroupal
должен удовлетворять следующим законам:
- ассоциативность:
product(a, product(b, c)) == product(product(a, b), c)
Определение в виде кода на 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))
Ссылки: