Коммутативный моноид
Формальное определение
CMonoid[A]
- моноид, который коммутативен.
Помимо законов моноида:
- Замыкание (closure): для \(\forall x, y \in CM\) выполняется \(x + y \in CM\).
- Ассоциативность (associativity): для \(\forall x, y, z \in CM\) выполняется \((x + y) + z = x + (y + z)\).
- Тождественность или существования нейтрального элемента (identity): существует \(\exists e \in CM\) такой, что для \(\forall x \in CM\) выполняется \(e + x = x + e = x\)
должен соблюдаться закон:
- Коммутативность (commutative): для \(\forall x, y \in CM\) выполняется \(x + y = y + x\).
Определение в виде кода на 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
Ссылки: