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

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

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

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

Определение в виде кода на 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

Ссылки: