モニャドセミナー #3

昨日開催された「技術者/プログラマのためのモナドと圏論」セミナー(モニャドセミナー) 第3回に行ってきました。例によって1時間遅刻。

前半

関手とその例だったようです。
ちょうど到着した頃に、しりとり圏からの関手、しりとり圏への関手の例の説明をしているところでした。毎回、実例の量が尋常じゃない。
僕も1つしりとり圏からの関手を思いついたので書いておきます。

対象
あ、い、う、え、お
しりとり
関手の対象部分
母音に移す。例)「か」├→「あ」、「め」├→「え」 など。「っ」とかは見ないことに。
関手の射部分
母音に移す。例) 「かき」├→「あい」、「てばさき」├→「えああい」

関手であることはほぼ自明。
逆にこれをしりとり圏へ埋め込むのも関手になっていて、これもほぼ自明。
これぐらいしか思いつかなかったです。
次にしりとり圏を変形したHShiri'という圏とHStarという圏、それらの間のChopという関手を定義して解説となりました。
そこで出てきた「HStarは、クリーネ スターです。」という説明が分からなかったのですが、Wikipediaにありました。クリーネ閉包 - Wikipedia。単純に自由生成(あってる?)したものでした。なるほど。
あと、圏での射はなんでもいい(からかえって混乱しがち)のに対して、関手は本当に「写像」だから具体的、分かりやすいという話も出ました。

後半

休憩をはさんでからの後半はスライドを無視しての、左右自明モノイドの解説になりました。
まず天下りに右自明モノイドを導入、モノイド性を確認。単位(0)の人工的な感じの気持ち悪さが強調された後、ある種の写像のなすモノイドを導入。これはあまり不自然な感じがしない。こちらもモノイド性の確認をする。この作業で写像のなすモノイドが右自明モノイドと同じになる*1ことが分かる。
続いて、双対となる左自明モノイドを全く同様にして導入。圏とその反対圏(双対圏)は形式上は矢印を逆転しただけで同じだが、実用上よく出現する双対では意味あいが全く違うことが多いことを強調して、代数⇔余代数*2を例示していました。その流れで、プログラミングでの単なる代入操作(破壊的代入)が右自明モノイドになっている*3こと、双対の左自明モノイドはProlog/Erlang等の単一代入規則が対応することが説明されました。
この右自明モノイド=破壊的代入操作(副作用)をつかって、普通の純関数の計算に副作用を持たせることの説明、要するにモナドの話になりました。モノイドを直積させる*4と、計算に副作用が入っていくことが具体的な構成で示されました*5
最後の15分はクライスリ圏の話でした。スタンピングが関手であることを使って計算をつなぐこと、その結果として破壊的代入操作が蓄積されること、蓄積された代入操作の方もモノイドの積でつながる、という話でした。

感想

後半のモノイド/モナドの話は、多分アドリブだったと思いますが、迫力十分、圧巻でした。自然変換の話を一切しなくても、関手とモノイドの性質だけでモナドのところまでいけるというのが発見でした。

聞きたかったこと

  • 自然変換も射より具体的

という話が、自然変換ごとなくなってしまったので。何が話される予定だったのか気になります。

  • 例の数

メタになるのですが、あれだけの圏や関手の例はどうやって思いつけるのか*6?というのが以前から関心があります。何を食べればいいんでしょうか。

ともあれ檜山さん、参加者の皆さん、お疲れ様でした/ありがとうございました。

*1:

*2:おそらく代数と余代数 最初の一歩で出ている、代数=関数型的、余代数=オブジェクト指向的、のことではないかと。たまたまちょっと前に読んだ。

*3:!!

*4:スタンピング。直和のスタンピングもあって、Maybeは直和の方@懇親会。

*5:世界で一番か二番くらいにやさしい「モナド入門」 - 檜山正幸のキマイラ飼育記 (はてなBlog)に言及していました。ほぼ同じですね。

*6:モニャドセミナーに参加している一番の理由です。