モナドと群・環・体

いつも忘れる群・環・体モナドを例に考えると実感がわくかな?

1. (return x) >>= f == f x
2. m >>= return == m
3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)
最初の規則は return が >>= に関して左単位元に なっていることを要請しています。二番目の規則は return が >>= に関して右単位元になっていることを要請しています。 そして、三番目の規則は >>= に関する一種の結合法則です。

http://www.sampou.org/haskell/a-a-monads/html/laws.html

まず、モナド則を満たすものは群かどうか考えてみる。

ある代数系(G,・)に対して、以下の条件を考えます。
1. 結合法則が成り立つ。
2. 単位元が存在する。
3. 逆元が存在する。
代数系Gが 1. を満たすとき、半群(semi-group)とよび、 1. 2. を満たすとき、モノイド(monoid)と呼びます。 また、1.?3. の全てを満たすとき、Gを群(group)と呼びます。
さらに、群(半群、モノイド)の中で、 交換法則を満たすものを可換群(可換半群、可換モノイド)と呼びます。
可換群はアーベル群(abelian group)もしくは加法群(additive group)とも呼ばれ、その算法は、しばしば + を用いて表します。

http://ufcpp.net/study/group/group.html

>>=演算は、結合法則が成り立ち、単位元returnが存在し、逆元が存在せず、交換法則を満たさないから、群ではないがモノイドではあるようだ。
(mとfはモナドと関数という違う集合に属してるけどこういってしまっていいのだろうか?)

1. mzero >>= f == mzero
2. m >>= (\x -> mzero) == mzero
3. mzero `mplus` m == m
4. m `mplus` mzero == m
mzero を 0 に、mplus を + に、そして、 >>= を × という算術演算にそれぞれ対応させれば、 mzero および mplus の法則を覚えるのは簡単です。

http://www.sampou.org/haskell/a-a-monads/html/laws.html

MonadPlusなら加法のmplusと乗法の>>=が揃うので、環や体かどうか考えてみる。

ある代数系(A,{+, ×})に対して、以下の条件を考えます。 (+ を加法、× を乗法と呼びます。)
1. 加法に関してアーベル群をなす。
2. 加法と乗法の間に分配法則が成り立つ。
3. 乗法に関して半群をなす。
4. 加法に関する単位元(零元)を除いて、乗法に関して群をなす。
代数系Aが 1. 2. 3. を満たすとき、環(ring)とよび、 1. 2. 4. を満たすとき、体(field)と呼びます。 また、これらは、乗法に関して可換であるとき、可換環・可換体と呼びます。

http://ufcpp.net/study/group/field.html

乗法である>>=はモノイドなので当然半群でもある。
加法であるmplusは、結合法則が成り立ち、単位元mzeroが存在し、逆元が存在せず、交換法則を満たさないから、アーベル群(可換群)ではない。
よって、MonadPlusは環でも体でもない。
分配法則はこんな感じ?
(m `mplus` n) >>= f == (m >>= f) `mplus` (n >>= f)