モニャモニャモナド行ってきた

圏について全く知識が無い状態で行ってきましたが、今回は圏の具体的な例をいっぱい出す回だったので、その具体的な圏については何となく分かった気分になれました。

composable とか

聞いてて重要そうなのが composable のような感じ。
この条件があるからこそガチャガチャ組み合わせていけるのかな。
>>= がモナド則を満たしている必要があるとか何とかとすごく関係がありそうな感じがする。


あと、最初 composable の条件を勘違いして dom(f) = cod(g) と理解していて、Order の例ところでやっと気がついたり。
何でこういう順番なんだろうと懇親会でちょっと聞いてみたのですが、圏を定義するときは f と g をうまく compose できるように dom や cod を定めて、compose したものから dom や cod の条件が定まるからじゃないかとか何とか……。

モノとか同型とか

モノ(mono?)とか同型(iso?)とかそういうのはどういう際に便利になってくるんだろうとか思ったりだったんだけど、きっとそれは圏の勉強してたら分かるに違い無い……。

Addition の例とか

Addition の例で 0 の周りに 1, 2, 3 の射の矢印があって、矢印の向かう先に答えがあるんじゃなくて矢印自体が答えというのがどうも不思議な感じだったのですが、1, 2, 3 というのを関数と考えると結構納得がいったり。
ただ dom(f) と cod(f) で2種類の値を返す必要があるのでとりあえず構造体として作っておいて、脳内プログラムしてみるとこんな感じに。

template<int N>
struct morph { };

template<int N>
int dom(morph<N>) { return 0; }

template<int N>
int cod(morph<N>) { return 0; }

template<int N, int M>
morph<N + M> compose(morph<N> n, morph<M> m)
{
    assert(cod(n) == dom(m)); // composable の条件
    return morph<N + M>();
}

これ、どんな射から dom とか cod しても 0 しか返ってこないのが何か悲しい感じ……。
これって dom(n) や cod(m) ってすると、ちゃんと加算した値が返されるようにするような圏とかも作れるのかなぁとか思ったり。

モナドとか

キーワードはクライスリ圏。
あと State モナドは別に複雑でもないらしい。
副作用のない言語で Update モナドとか、Haskell がかなりやばそうな言語というのがビンビンとしてきたので休み中にでもインストールして遊んでみよう。

圏のすごさとか

自分は圏をプログラミングに生かしたいと考えてる人なので、圏がどれだけ有用性があるかがすごく気になっていたり。
で、それを聞いてみたところ、DI のインターフェースの部分を圏としてしまえばどんどんインターフェースを compose していって楽しそうなことが出来そうな雰囲気が感じられたりとか、他にもいろいろ応用できそうな感じがいろいろ。
圏が日常に感じられるようになるとかなり面白い組み合わせが思い付きまくるのでは。そう考えると圏を学ぶのがすごく楽しいような気がしてきた。




懇親会で 告知:第二回「層・圏・トポス 現代的集合像を求めて」勉強会 - hiroki_f’s diary をやるというのを聞いてかなり面白そうな感じがしたので、今度の日曜日に行ってみようと思います。
7時間耐久レースです。脱落者はまだいないらしいので最初の脱落者候補として頑張ってきます。