Группа моноидов
Схема
Использование
Моноиды обычно используются для сворачивания последовательностей. Например, вот как можно посчитать произведение чисел:
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
Ссылки: