圏論勉強会 @ ワークスアプリケーションズのモナドの説明をもとにまとめた
モナドの定義
圏におけるモナドとは、
をモナドの単位元、をモナドの積などと呼ぶ。
理論計算機科学でのモナド
を型と関数の圏とした場合、計算作用を自己関手によって表現する。 この計算作用の表示がであり、計算の表示が射ということになる。(クライスリ圏とクライスリ射)
計算作用
モナドで扱うような計算作用
元記事へのリンク
- 値を返さない場合がある(partiality)
- 複数の計算結果がある(nondeterminism)
- 副作用がある(side-effects)
- エラーが発生する(exception)
- 継続(計算機科学)を返す(continuations)
計算とを単純に合成すると、計算作用が2回発生するため、出力がという型になってしまう。例えば、が副作用を表しているならば、は「副作用が2度発生する」という計算作用を表す。
graph LR A --f--> 2["T(B)"] --g--> 3["T²(C)"]
しかし、「副作用のある計算」をいくつ合成しても、単に「副作用のある計算」と認識することが多い。そこで、自然変換をつかって畳み込みをすることで、複数の副作用をまとめることにする。この計算作用の畳み込みは結合的である。
graph LR A --f--> 2["T(B)"] --g--> 3["T²(C)"] --μ--> 4["T(C)"]
また、「何もしない」という計算を表現する必要がある。これは自然変換で表すことにする。この「何もしない」計算は単位的である。
do構文とモナド
圏論がわからない場合は、モナドは単にdo構文だとおもって捉えるのが良さそう。