前回に続き、qiita内の圏論に関するエントリの真偽を検証します。
モナドを使って副作用のある関数を純粋な関数にする
正しいことも書いてありますが、話の核の部分は完全に誤っているエントリです。
ある圏の中の関数を合成した関数は、同じ圏の中にないといけないのです。
正しい主張です。
圏論で言うところの直和です。
でも例外には直和を使えと書いてあります。
文章中の定義を直和と言っていいかは微妙ですが、通常、例外を数式で扱うには直和を用います。
でも大丈夫、この大変な変換をしてくれるのがモナドなのです!
クライスリ圏における射の合成のことを言っているのであれば、正しい主張です。
自己関手Tと2つの自然変換η、μの組です。
正しい主張です。
関手というのは圏を別の圏に変換する変換で
正しい主張です。
自然変換は関手を別の関手に変換する変換です。
自己関手TはCをCへ変換するものです。
ηは1CをTに変換する自然変換です。
μはT2をTに変換する自然変換です。
「変換」を使うべきかは議論がありますが、正しいと言っても差し支えはないと考えます。
2つの自然変換はただの自然変換ではなく、以下の可換図式を満たさないといけません。
wikipediaの引用ですが、正しい記述です。
T(i)=Right(i)
T(s)=Left(s)
誤っています。自己関手Tの対象関数を定義している式と予想されますが、Right i、Left sはいずれも対象ではありません。Either、もしくはeが対象と考えられます。
T(fis)(x)= ...
T(fsi)(x)= ...
誤っています。自己関手Tの射関数を定義している式と予想されますが、この定義では関手になりません。$T(\rm{length} \circ \rm{em})(\rm{"XYZ"}) \ne (T(\rm{length}) \circ T(\rm{em}))(\rm{"XYZ"})$となり、結合則が満たされません。
ηは1CをTに変換する自然変換で、μはT2をTに変換する自然変換です。
1Cというのは、自分を自分にそのまま対応させる関手で、int型をint型に、fiiをfiiに、というように、何もしない変換です。
正しい主張です。
これが可換図式を満たすことを確認します。
...
というわけで、このTとμとηの組は本当にモナドです。
...
なんにせよ、モナドのおかげで不純な関数を消して、純粋な関数だけからなる世界を作ることができました。
誤っています。Tが関手ではないため、この議論は成立しません。
今回の訳注
例外をつけくわえるモナドは、 $T X = E + X$として知られています。 $+$ がいわゆるEither型構築子です。