purescriptを勉強している途中で少し群をwikipediaで読んでみた。前提として、群の前提知識はない。
定義を読む。なるほど。群は集合Gと、Gの要素2つを引数にGの要素を返す演算μの組に対して定義されるのか。(G上のとかって表現、昔意味わからなくて苦しんだ。。)
具体例があるので定義に当てはめてみる。
(G, μ)=(実数, 足し算)の場合
結合法則
a+(b+c)=(a+b)+c
単位元の存在
まあ0やな
a+0=0+a=a
逆元の存在
任意のaに対して、-aが逆元になりそう
a+(-a)=(-a)+a=0=単位元(単位元は0だったからokやな)
交換法則
a+b=b+a
(G, μ)=(0を除く実数, 掛け算)の場合
結合法則
それはそう
a*(bc)=(ab)*c
単位元の存在
1やな
a1=1a=a
逆元の存在
任意のaに対して1/aがあって、
a*(1/a)=(1/a)+a=1(1は単位元)
交換法則
ab=ba
確かに成り立ってる。
条件ごとの名前
条件を満たすごとに出世魚のように名前が変わって、
結合法則だけ=>半群
結合法則と単位元だけ=>モノイド(実数に対する足し算をイメージ。ただし、-aがあるとは限らず、a+b=b+aとも限らない。0はある。)
結合法則と単位元と逆元だけ=>群(実数に対する掛け算のイメージ。実際μ(g,h)をghと書くらしい。と思ったけど、 ab=baとも限らないし実数から0は除いて考えないといけない。1や1/aはある。)
結合法則と単位元と逆元と交換法則=>アーベル群(可換群)(実数に対する掛け算をイメージ。と思ったけど実数から0は除いて考えないといけない。)
(追記・他で読んだ)
結合法則と単位元と交換法則=>可換モノイド(モノイドに加えてa+b=b+aが成立する足し算をイメージ。と思ったけど、-aがあるとは限らない。)
というらしい。
一旦ここまで。
purescript
ちなみにpurescriptで見てみると、半群はappendだけ定義が求められている。
(G, μ)=(a, append)っていうことだろう。
class Semigroup a where
append :: a -> a -> a
結合法則を満たすような実装が求められてると思うんだけど、そうであるならappendは書き方として中間演算子として使うと便利そう(infixr 5 append as <>
なので、<>
は実はappendだったんやな)
普通
append a (append b c)
中間演算子ver(結合法則を満たすなら左右どちらを先に評価しようが変わらないはず)
a `append` b `append` c
typescriptで書くと、
interface Semigroup<T> {
append: (a: T) => (b: T) => T
}
みたいな感じかな。
typescriptでも演算子を定義したい。