Arantium Maestum

プログラミング、囲碁、読書の話題

Category Theory for Programmers 1.1メモ

最近Bartosz MilewskiのCategory Theory for ProgrammersシリーズをYoutubeで観はじめた。メモとして記事にしておく。

第一シリーズは全10回、各回が前後篇にわかれている。

1.1回目:

www.youtube.com

最初の回はプログラマにとっての圏論の意義とは?というところから。

合成可能性と抽象化

プログラムを書くときに重要になるのは:

  • 合成可能性
  • 抽象化

この二つによってコードの再利用性が高まる。

プログラミング言語の進化でも上記二つの概念が重要:

  1. Assembly
  2. Procedural
  3. Object Oriented

と進んでいって、クラスによる抽象化・合成で再利用性が高まる、というのがOOの売りだった。

しかし、例えば並行性について考えると、オブジェクトの隠蔽する「破壊的変更」と「データ共有」によってデータ競合の可能性も隠蔽されてしまう。なのでOO言語で並行コードを書く場合はロックを使うが、ロックもうまく合成しない。オブジェクトというのはそもそも(並行性を考えると)間違った抽象だったのでは?

より高次元な言語を求めて

どんな言語でも、その言語の限界ギリギリを使うライブラリ作者がいる。

C++の場合はテンプレートメタプログラミングを使う場合が多い。MilewskiがC++を使っていた頃、そういった技巧が凝らされたライブラリのコードを見て「こんなの絶対に思いつかない」と思った。

しかしその後Haskellを使ってみると、同じ考えが非常に明快に使われていて、実際には非常に簡単な概念だったことに気づく。難しく見せていたのは「C++言語の限界」付近で不自然なコードを書いていたから。

Haskellでも言語の限界に近いコードを書くライブラリ作者がいる。Kmettがその一人で、彼は圏論の概念をHaskellに翻訳しているが、時々それはHaskellの限界に近づいて不自然に見える。

そう言う意味で圏論C++より、Haskellより高次元な言語だと言える。(ただしプログラムとして実行できないという大きな違いはあるが)

圏論とパターンと世界と脳

最後にちょこっと哲学的な話。

圏論は合成できるパターンを研究する学問。

関係ないと思われていた数学の各分野や、数学ではない分野で、圏論を通して同じ形、同じパターンだと認識できるようになったケースがたくさんある。

こういうパターンが頻出するのは世界の隠された構造を発見しているからか、人間の脳の習性としてパターンのあるものしか認識できないからか。