scalabook

Форк
0
/
idempotent-monoid.md 
50 строк · 2.0 Кб

Идемпотентный моноид

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

IdempotentMonoid — это моноид, который также является идемпотентным, т.е. добавление значения к самому себе приводит к тому же значению.

IdempotentMonoid

должен удовлетворять законам своих "родителей":

  • Замыкание (closure): для \(\forall x, y \in IM\) выполняется \(x + y \in IM\).
  • Ассоциативность (associativity): для \(\forall x, y, z \in IM\) выполняется \((x + y) + z = x + (y + z)\).
  • Тождественность или существования нейтрального элемента (identity): существует \(\exists e \in IM\) такой, что для \(\forall x \in IM\) выполняется \(e + x = x + e = x\)
  • Идемпотентность (idempotency): для \(\forall x \in IM\) выполняется \(x + x = x\).

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

trait IdempotentMonoid[A] extends Monoid[A], Band[A]

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

trait IdempotentMonoidLaw extends MonoidLaw, BandLaw:
def checkIdempotentMonoidLaw[A: IdempotentMonoid](
x: A,
y: A,
z: A
): ValidatedNel[String, Unit] =
checkMonoidLaw(x, y, z) combine checkBandLaw(x, y, z)

Примеры

Множества

Некоторые операции над множествами являются идемпотентными: объединение, пересечение и т.п. Например, объединение множеств образуют IdempotentMonoid

:

given [A]: IdempotentMonoid[Set[A]] with
override def empty: Set[A] = Set.empty[A]
override def combine(x: Set[A], y: Set[A]): Set[A] = x ++ y

Ссылки:

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

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

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

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