たまには誰かの役に立つであろうことを書いてみようかと思いたったので、圏論について書いてみようかと思い始めた。(ただしまだまだ学習中であって圏論について明るいというわけでもない) ので、序論と言うかモチベーションの部分をまずまとめておく。
そもそも、プログラミングをするにあたってなぜ圏論が有用か。
組み合わせ / 分割
圏の公理からして組み合わせ / Composability の概念が含まれていて、それこそがプログラムの再利用性や可読性を上げるもの、という点があげられる。 組み合わせができる
ことは逆の視点から見ると、 分割ができる
ことと同じと捉えることができる1。
プログラミングにおいて、コードを小さな要素に分割して再利用することの大切さは DRY2 原則や、 UNIX哲学3 で十分に知られているように思う。 圏論はある意味そのフレームワークとなり、その考え方や捉え方、道具 ( 射
, 関手
, 自然変換
, モナド
... ) を持っていることで、 分割、組合わせをよりうまくできるようになれる、という感覚を持っている。
分割ができることのその先に、分割したコードをどこに置くべきかのモジュール設計や、もっと一般には設計論 ( DDD
, クリーンアーキテクチャ
, MV*
) があるはずで、 分割できないことには、そもそもどのモジュールにどのようなコードを置くか、という操作ができない。 その意味で、圏論を知って組み合わせ/分割をより良くできることは、設計論に先んずるとも言えるはず。
広い視点
例えばカリー=ハワード=ランベック対応4という概念があって、証明論とラムダ計算の理論がどちらも圏論で説明できる5。 例に限らず、圏論的に見ると、違っているように見えても同じ構造を持っていること、というのがよく見られる。 そのような抽象的な視点、というのは圏論を知らない人から見ると、 天から降ってきた思考
や 柔軟なものの捉え方
のような言葉でしか表せないのに対して、 実際の違いとしては圏論の知識があるかないか、という点に限られている。 また、そのような抽象的な考えのフレームワークを手に入れる事は、プログラミングに限らず、事業運営なり対戦ゲームなり、生活を豊かにするために利用できる、と言えると思っている。