Qiita内の圏論エントリを読んでいきます。ストック数が多いものに着目しています。
遅延評価とはなにか、そしてモナドの話
圏論については正しい内容が書かれたエントリかと思います。
今まで、「プログラムは関数だ」と思ってプログラムを書いてきましたよね。違うんです。クライスリ圏の射だって言うんです。
正しい主張です。
モナドは(普通の意味では)遅延評価ではない。
こちらの主張にも賛同します。
「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?」
ほぼ正しいことが書かれたエントリかと思います。
上で定義したモナドTはC→Cなる関手であるからCの自己関手の圏における対象である.
正しいです。
有限limitをもつ圏Cの対象Xが モノイド対象 とは, モノイド演算μ:X2→Xと単位元e:1→Xが存在して, 以下を満たすことである.
限定的な定義にはなっていますが、正しい表明です。
C上のモナドは, 圏[C,C]のモノイド対象と同じ概念であることが分かる.
前述の定義が限定的な定義のために理論の飛躍がありますが、誤っているとまでは言えないかと思います。
Haskellと随伴
正しいことが書かれているエントリかと思います。
随伴というのは2つの関手の関係のことです.
F:C→D, G:D→Cがあったとき, 随伴F⊣G とは, 自然同型 hom(F⋅,⋅)≅hom(⋅,G⋅) のことです
正しいセンテンスです。
Haskellでは最もtypicalな例です. s×−⊣(−)s という形の随伴です.
非常に有名な随伴です。
(->) sは一般のsに対しては右随伴を持たないことを示してみましょう.
証明も適切です。
Monadを巡る困難についてのぼやき
ほぼ正しいことが書かれているエントリかと思います。
要は fmap はHaskellの函数全体が作る圏からその部分圏への函手です、fmapで函数の構造を保存したまま部分圏の函数が得られますよ、というか函手の条件を満たすようなfmapを提供することによってそういう構造保存的な部分圏を提供するんですよ、というだけのことである。ところが、部分圏の射自体がHaskellの圏の射だから、当の函手が自分自身に適用されてm (m a)のようにMonadのマトリョーシカを作ってしまう。Functorはまさにこれである。
モナドは自己関手で定義されるため、部分圏は考えない方が妥当です。が、考え方は正しいです。
でも、入れ子を外せないと不便なので(リスト操作でしょっちゅうconcatにお世話になっていることを考えればそれは明らかだろう)、fmapに加えて入れ子を外す(というか自分に属する射を自分に属する射に移すというか)joinを提供する構造もお付けしました、というのがMonadなわけでしょ。
定義に触れていないものの、記述に誤っている部分はないと考えます。
次回に続く。