Коммутативная полугруппа

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

CSemigroup[A] - полугруппа, которая является коммутативной.

Помимо законов полугруппы:

должен соблюдаться закон:

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

trait CSemigroup[A] extends Semigroup[A]

Законы в виде кода на Scala

trait CSemigroupLaw extends SemigroupLaw:
  def checkCSemigroupLaw[A: CSemigroup](
      x: A,
      y: A,
      z: A
  ): ValidatedNel[String, Unit] =
    checkSemigroupLaw(x, y, z) combine
      check(
        CSemigroup[A].combine(x, y) == CSemigroup[A].combine(y, x),
        "commutative: x + y = y + x"
      )

Примеры

Натуральные числа N образуют коммутативную полугруппу относительно сложения

given CSemigroup[Int] = (x: Int, y: Int) => x + y

Реализация

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

import spire.algebra.CSemigroup

CSemigroup.combine(1, 2) == CSemigroup.combine(2, 1)

Ссылки: