scalabook

Форк
0
60 строк · 1.8 Кб

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

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

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

Ссылки:

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.