Группа моноидов

Схема

monoid

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

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

trait Semigroup[A]:
  def combine(x: A, y: A): A

trait Monoid[A] extends Semigroup[A]:
  def empty: A

given Monoid[Int] with
  val empty = 1
  def combine(x: Int, y: Int): Int = x * y

def fold[A](xs: List[A])(using m: Monoid[A]): A =
  xs.foldLeft(m.empty)(m.combine)

fold(List(1, 2, 3, 4, 5))
// val res0: Int = 120

Более подробно применение моноидов рассматривается в книге Scala with Cats.

Обычно библиотеки определяют "свой" оператор для моноидальной операции combine, например:

trait Semigroup[A]:
  def combine(x: A, y: A): A
  
  extension (x: A)
    def |+|(y: A) = combine(x, y)

...

3 |+| 4
// val res1: Int = 12

Ссылки: