Коммутативный моноид

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

CMonoid[A] - моноид, который коммутативен.

Помимо законов моноида:

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

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

trait CMonoid[A] extends Monoid[A], CSemigroup[A]

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

trait CMonoidLaw extends MonoidLaw, CSemigroupLaw:
  def checkCMonoidLaw[A: CMonoid](
      x: A,
      y: A,
      z: A
  ): ValidatedNel[String, Unit] =
    checkMonoidLaw(x, y, z) combine checkCSemigroupLaw(x, y, z)

Примеры

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

given CMonoid[Int] with
  val empty                        = 0
  def combine(x: Int, y: Int): Int = x + y

Реализация

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

import spire.algebra.CMonoid

CMonoid.combine(100, CMonoid.empty[Int]) // 100

Ссылки: