まとめはこっち
前回のおさらい
半群とは以下の条件を満たす集合Sと演算*の組のこと。
条件1. 集合Sが演算*に対して閉じている
すなわち、S上の任意の元a, b に対して、演算結果 a * b は再び S に属する。
条件2. 集合S上の演算*は結合法則を満たす。
すなわち、S上の任意の元a, b, c に対して、
(a * b) * c = a * (b * c)
色々な半群
半群にも色々種類があって、特徴的なものは名前が付いていたりします。
空半群
何も元を持たない集合と、演算としては空写像の組が空半群です。
class SemiGroup[S](f: (S, S) => S) {
def append(a: S, b: => S) = f(a, b)
}
val emptySemigroup = new SemiGroup[Unit]((_, _) => Unit)
単元半群
元を1つだけ持つ半群が単元半群です。自動的に演算はその元2つを引数にとって、その元を返す演算になります。
class SemiGroup[S](f: (S, S) => S) {
def append(a: S, b: => S) = f(a, b)
}
object Singletonval semigroupWithOneElement = new SemiGroup[Singleton]((_, _) => Singleton)
可換半群
半群が交換法則を満たすとき、すなわち二項演算子の被演算数(引数)を入れ替えても計算結果が同じ
ならば可換半群と言います。
整数は加法についても乗法についても可換半群を成します。
行列は加法については可換ですが、乗法については可換ではありません。
ここから先は
半群に単位元が存在するとモノイドです。次回扱う予定です。