圏論について
ムツカシイので、何が難しいのか考えてみました。
プログラミング言語を数学として考える場合には、何もない状態からの数学的な体系を構築する事が必要になります。
ゼロから構築するので、自由にどのように構築しても良い訳です。
自由ではあるのだけど、一般的に用いられる手法を使って考えるのがよさそうです。
たとえばラムダ計算として集合論を使って捉える事が行われて来ました。
オブジェクト指向はオブジェクト計算として捉えられています。
いろいろな性質を持った物を集合として扱うとうまく行くのです。
しかしながら、集合論が万能というわけでもありません。
なので、集合論を拡張した数学がいろいろと存在しています。
例えば、層とかトポスとか圏とかが集合論を拡張したものとして捉える事ができます。
そう、圏論は、集合論をより拡張したプログラミング言語を考える上での道具として使う事が出来る物なのです。
圏論を使ってゼロからプログラミング言語を考えるとうまく行く事が多いようなのです。
また、圏論をベースにライブラリを構築しているのがScalazです。
まだまだ発展中のものなので、すぐに使えるというわけでもないし一般的なプログラマにすぐに普及するわけでもないですけど、
面白い分野であるわけです。
圏っていうと思い起こすのは大気圏とか首都圏とか英語圏とか、文化圏とか、なんかたいそう大きな範囲を表す感じがすると思います。でも、英語でいうと圏はカテゴリです。カテゴリに分類するとかいいますよね。圏よりは、小さい領域に感じると思うのですが、みなさんはどうでしょう?カテゴリ論っていったほうが簡単な感じがすると思うんですけど、まぁ同じ物です。
オブジェクト指向が万能か?というと、どうもそうではないようです。コードの再利用性が高いかというと、高階関数を使った関数型言語のほうが、再利用性は高いです。オブジェクト指向は、安全性が保証される物でもありません。もっと良く出来そうなわけです。
そのもっと良くする事を考える道具の1つが圏論なのです。
オブジェクト指向の発展ではないので、オブジェクト指向とは違った形で表されます。従って、すぐに使えると言う物ではありません。でも、オブジェクト指向とは違った視点で物事を捉えることで、うまく分析することが出来る事もあるわけです。
たとえば、物理で音楽を考える事も出来ますが、音楽は音楽の考え方で捉えた方がおそらくは、より、うまく分析できますよね。
でも、歌詞は文学として捉えた方がうまく行くかもしれないですよね。
でも、録音して再生するとかなるとまた、違う分野の考え方がうまく行くかもしれません。
圏論はどうやって産まれたの?
圏論のベースとなる考え方は集合論です。
そこから、モノイド・群を作ります。
モノイド・群は対象が1つの圏として捉える事で、圏へ発展させる事ができるそうです。
http://nineties.github.io/category-seminar/2#/6
ということで、自分の中で良くわからない事は大分なくなったんですけど。
圏論は誰が考えた?
サミュエル・アイレンベルグ(Samuel Eilenberg, 1913年9月30日 - 1998年1月30日)はポーランドのワルシャワ出身の数学者である。ワルシャワ大学で博士号取得、長年コロンビア大学数学科教授を務めた。数学者集団ブルバキのメンバーでもあった。
代数的位相幾何学、ホモロジー代数に大きな業績を残した。
1986年にウルフ賞数学部門受賞。
だそうです。
ポーランド人がコロンビア大学で考えたっぽいですね。ブルバギってのに入ってたらしいと。
で、圏論はどうも、トポスとかいうものを作る道具にもなったりしてるらしいです。計算機科学のためだけのものではないらしいんですね。
計算機科学のための圏論
計算機科学(computing science)は、急速に発展した若い領域であることから、その領域内の諸概念を組織的に定式化する手法に未成熟であった。圏論はその計算機科学の必要としていた手法をもたらすものであったため、現在まで有効に活用されている。計算機科学における圏論の使用はジョセフ・ゴーグエンのA Categorical Manifestoによってその指針が与えられている。
http://www.cs.ox.ac.uk/files/3395/PRG72.pdf
ってことだそうですのでジョセフ・ゴーグエンって人が最初に圏論を活用する事を考え始めたのかな?
関数型言語 乱立の時代
1985年、遅延関数言語である Miranda がリサーチ・ソフトウェア社によって発表された。1987年にはこのような非正格な純粋関数型プログラミング言語が十二以上存在していたが、そのうち最も広く使われていた Miranda はパブリックドメインではなかった。オレゴン州ポートランドで開催された Functional Programming Languages and Computer Architecture (FPCA '87) において開かれた会議中に、遅延関数型言語のオープンな標準を作成するための委員会が発足されるべき、という強い合意が参加者のあいだで形成された。委員会の目的は、関数型言語のデザインにおける将来の研究のための基礎として役立つ共通のものへと、既存の関数型言語を統合することであった
1990年にHaskell1.0がは遅延評価型の関数型言語の乱立している中で標準的でオープンな実装を目指して作られたと。
12以上あったというのだから、1つにまとまるのは良いことだったんでしょうね。
http://alohakun.blog7.fc2.com/category6-2.html
ってことで、ジョセフ・ゴーグエンから、どうHaskellに繋がるのかはよくわからないのですけど、この辺にしておこうと思います。
圏論を歴史的に見たり、成り立つ元の原型を見たりすると理解に繋がりやすいのかなぁって思うので、いろいろ調べてみました。
前より、圏論が身近に感じられるようになったと思います。
あと、Scalaによる圏論の説明や、いろいろなモナドの説明も見て回ってなんか、ほんとうによく、分かった気がします。
モナドはインタプリタ用のDSLを書く為のデザインパターンと考えていいようです。
jQueryもモナドみたいだって話は、本当なんだなぁと、jQueryはモナドじゃないでしょ。みたいに思ってたのですが間違えてたんだなぁと。
普通のデザインパターンとの違いは、数学的なバックボーンがあるかどうかで、モナドは圏論っていう後ろ盾があるので強いんですね。
集合にしても、圏論にしても、数学が得意なら便利なんですけど、数学が苦手だと返って不便に感じるので、特に、処理系やライブラリを作ったり変更したりするような事をしないのであれば、理解する必要はないものです。
デザインパターンを知らなくても、プログラムは書けます。
だけど、デザインパターンを知ってれば、Javaのライブラリはより理解しやすいでしょう。
同じように、圏論を知っていれば、Haskellのライブラリは理解しやすくなるのだと思います。
いうなれば圏論とは関数型言語におけるデザインパターンの基礎なのです。
ところで、デザインパターンに数学的基礎ってあるのでしょうか?
http://bookscomputer.seesaa.net/article/342562084.html
あるのかもしれません。
オブジェクト指向についての、数学的な研究もあって、TAPLにはその事が書かれています。五十嵐淳先生のFeatherweight Java (FJ)等があります。
http://d.hatena.ne.jp/propella/20110729/p2
プロペラさんの話みると面白いです。
プログラミング言語の基礎概念(CoPLっていうんですね。知らなかった)の著者ですよね。
で、こんなものしらなくても、Javaは書けるんですけど、やっぱりちゃんとした理論があるといいですよ。
理論的に考察されたものは、最適化されたアルゴリズムになっているというか、短くプログラムを書く事に命をかけてるところがあるように思うんですよね。
単純に計算出来るとかっていう法則を探したりするので。
ということで、FJの美しい実装が欲しい所です。