Category Theory for Programmers 1.1メモ
最近Bartosz MilewskiのCategory Theory for ProgrammersシリーズをYoutubeで観はじめた。メモとして記事にしておく。
第一シリーズは全10回、各回が前後篇にわかれている。
1.1回目:
最初の回はプログラマにとっての圏論の意義とは?というところから。
合成可能性と抽象化
プログラムを書くときに重要になるのは:
- 合成可能性
- 抽象化
この二つによってコードの再利用性が高まる。
プログラミング言語の進化でも上記二つの概念が重要:
- Assembly
- Procedural
- Object Oriented
と進んでいって、クラスによる抽象化・合成で再利用性が高まる、というのがOOの売りだった。
しかし、例えば並行性について考えると、オブジェクトの隠蔽する「破壊的変更」と「データ共有」によってデータ競合の可能性も隠蔽されてしまう。なのでOO言語で並行コードを書く場合はロックを使うが、ロックもうまく合成しない。オブジェクトというのはそもそも(並行性を考えると)間違った抽象だったのでは?
より高次元な言語を求めて
どんな言語でも、その言語の限界ギリギリを使うライブラリ作者がいる。
C++の場合はテンプレートメタプログラミングを使う場合が多い。MilewskiがC++を使っていた頃、そういった技巧が凝らされたライブラリのコードを見て「こんなの絶対に思いつかない」と思った。
しかしその後Haskellを使ってみると、同じ考えが非常に明快に使われていて、実際には非常に簡単な概念だったことに気づく。難しく見せていたのは「C++言語の限界」付近で不自然なコードを書いていたから。
Haskellでも言語の限界に近いコードを書くライブラリ作者がいる。Kmettがその一人で、彼は圏論の概念をHaskellに翻訳しているが、時々それはHaskellの限界に近づいて不自然に見える。
そう言う意味で圏論はC++より、Haskellより高次元な言語だと言える。(ただしプログラムとして実行できないという大きな違いはあるが)
圏論とパターンと世界と脳
最後にちょこっと哲学的な話。
圏論は合成できるパターンを研究する学問。
関係ないと思われていた数学の各分野や、数学ではない分野で、圏論を通して同じ形、同じパターンだと認識できるようになったケースがたくさんある。
こういうパターンが頻出するのは世界の隠された構造を発見しているからか、人間の脳の習性としてパターンのあるものしか認識できないからか。