Semigroup, Monoid и Group

Самые основные классы алгебраических типов, поддерживаемые Spire, включают один ассоциативный бинарный оператор (называемый op и представленный как |+|): Операции варьируются от сложения и умножения до объединения строк или списков и не только!

Полугруппа

Semigroup:

import spire.algebra.Semigroup
import spire.syntax.semigroup.*

1 |+| 2                           // 3
("hello", 123) |+| ("world", 321) // ("helloworld",444)

Semigroup.combineN(3, 5)          // 15

Моноид

Monoid - полугруппа, которая также имеет единичный элемент id. Monoid расширяет Semigroup.

1 |+| Monoid.empty[Int] // 1
Monoid.isEmpty(Monoid.empty[Int])

Группа

Group - моноид, который также имеет обратную операцию (inverse или |-|). Group расширяет Monoid.

import spire.algebra.Group
import spire.syntax.group.*

1.inverse       // -1
1 |+| 1.inverse // 0

Коммутативная полугруппа

CSemigroup[A] - полугруппа, которая является коммутативной.

import spire.algebra.CSemigroup

CSemigroup.combine(1, 2) == CSemigroup.combine(2, 1)

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

CMonoid[A] - моноид, который коммутативен.

import spire.algebra.CMonoid

CMonoid.combine(100, CMonoid.empty[Int]) // 100

Абелева группа

AbGroup[A] - "абелева группа", группа, которая является коммутативной.

import spire.algebra.AbGroup

AbGroup[Int].inverse(1) // -1

Действия

(Left/Right/)Action[P, G] - действия влево/вправо для полугрупп/моноидов/групп

import spire.algebra.*
import spire.syntax.action.*
import spire.syntax.group.*

given LeftAction[Int, String] with
  def actl(g: String, p: Int): Int =
    g.toIntOption.getOrElse(0) - p

given RightAction[Int, String] with
  def actr(p: Int, g: String): Int =
    g.toIntOption.getOrElse(0) - p

"100" |+|> 10 // 90
10 <|+| "100" // 90

Описание

Большинство типов имеют множество возможных реализаций этих классов типов. В этих случаях Spire требует от пользователей явного выбора желаемой реализации.

Spire также определяет две параллельные иерархии групп для аддитивных и мультипликативных групп. Они имеют одинаковые свойства, но разные имена и символы. В следующем списке представлены общие, аддитивные и мультипликативные варианты:


Ссылки: