このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

圏論とオブジェクト指向

あっ、そういえば
http://d.hatena.ne.jp/m-hiyama/20051124/c/

圏論オブジェクト指向の関係は、というとね …… コメントじゃ場所が窮屈だな、いずれまた本文で

なんて書いたことがある、だいぶ前に。発端は、http://d.hatena.ne.jp/bonotake/20051127/1133025173 とか http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20051112#p01 あたり。

圏論オブジェクト指向は別に関係ないっす」と言うのが、とりあえずは無難で妥当な答えだと思いますよ(身も蓋もない)。

僕はオブジェクト指向ってよくわからない。なんか小難しくて。経験豊富な人がある主張をしますね、別な経験豊富な人が反対の主張をしたりしまして、僕には何がホントのことか判断できない。恣意的な党派対立なのか、なんか(経験以外の)根拠があるのか/ないのか?

主張に明白な根拠とその説明がないと、「修行」とか「悟り」とかに頼ることになりますね。実際、求道者やら教祖やらみたいな人もいるみたいですし。僕はこういう状況は苦手、闇雲な修行はしたくない、我慢して悟りたいとも思わない

一方、圏論は、対象を総体としてマクロスコピックに理解するには役立ちます-- これはハッキリと分かっていること。それで、「別に関係ないっす」は承知の上で、オブジェクト指向の伝承的モヤモヤ世界を圏論でスッキリ理解できればいいなー、とは希望しているのです(できてないけど)。

以下は、説明は全部省略して、単に僕が見ている“景色”を述べるだけです、あしからず。

枠組み

大枠としてはインスティチューションでしょう、やっぱり。ただし、インスティチューションは何にでも使えるので、オブジェクト指向に特有な現象を説明できるわけではないですね。もっと狭くて強い枠組みには余代数があります。単一のクラスを説明するには余代数はけっこういいですよ。(いまいち中途半端な入門だけど→http://www.chimaira.org/docs/AlgebrasCoalgebras.htm

複数のクラスが絡んだシステムは、代数/余代数だけでは定式化が辛い。ここは隠蔽代数でしょうか。隠蔽代数は、始代数/終余代数のようなtightな意味論を使えないので、ちょっとボンヤリしているし、扱いが煩雑です。全体は隠蔽代数で考え、使える部分では代数/余代数でクリアに考える、ってのが現実的な気がします。

対応

いずれの枠組みを採用するにしても、次のような対応を念頭に置きます。

オブジェクト指向 圏論、仕様論
インターフェース 指標
仕様(インターフェース+制約) セオリー
ソースコード
実行可能なコード(+実行系) モデル


通常は、「実装 ⇔ モデル」という対応で考えますが、「実装」と言っても、ソースコードと実行可能形式は区別すべきです(区別しなくていいことも多いが)。

インスティチューションにおける「モデル」は、おそらくはdenotationとしての抽象実行系を想定していて、ソースコードに対応する概念がインスティチューション内に(通常は)ないのですが、特定のプログラミング言語を考察したいときは、構文的対象の圏がないと困ってしまうのです。あるいは、プログラムテストとプログラム証明を同時に考えるとき、テストは実行に関わる概念で、証明はソースの字面に関わる概念でしょう。ここでも字面=構文が必要です。

指標圏

指標圏を実際に作ってみると、多くの場合、直和やinclusionが定義できて、とても扱いやすい圏になります。空指標が始対象、ファイバー積の双対(コファイバー積だっけ、ファイバー余積だっけ? pushoutだ)もあるから、有限余完備オブジェクト指向のインターフェースが扱いやすいのは、指標圏が有限余完備であることで説明できそうです。

指標圏の良い性質を、セオリーの圏まで持ち上げられるか? たぶんYESだと予想しますが、僕はよくわかってません(あがいている→http://www.chimaira.org/docs/CategoryOfTheories.htm

型階層

型階層に関しては随分と誤解と混乱がありますね。

現実的な指標圏にはinclusionがあるので、まずこれが型階層とみなされることがありますが、型階層と呼ぶには役不足。セオリーの圏(正確には、indexed categoryを平坦化する)に適切なmonomorphismがあれば、これは型階層を定義すると言っていいでしょう。「インターフェースも型とみなす」と言っているのは、実際上は(潜在的にでも)「セオリーを型とみなす」ことで、セオリーの圏で型階層を考えることです。

セオリーの圏で、「SがTのサブタイプ(派生型)だ」というとき、射は、T→Sの向きになります。例えば多重継承は、T1→S, T2→Sなのでmonoな余スパンです。一方で、モデルの圏(これも平坦化する)にも型階層がありますが、ここでは、「DがBのサブタイプだ」というとき、D→Bのepimorphismが介在しています。よって、多重継承は、D→B1, D→B2のようなepiなスパンとなります。

おおざっぱなにまとめれば、仕様レベル(セオリーの圏)と実装レベル(モデルの圏)では、型階層の概念が逆(一種の双対)なんです。この違いとひっくり返し現象が見えてないのは、ちょっと困るなー。例えば、セオリーの圏がinclusion付き有限余完備だとしても、ただちに同じ事をモデル圏に期待することはできません。

やっぱり分からないなぁ

オブジェクト指向は人間にとって考えやすい/使いやすいと言われているし、僕もそんな気がします。でも、この「考えやすさ」はどこから来るんでしょう。余代数/隠蔽代数で考えると、暗黙の状態空間(隠蔽ソート)や関数への暗黙の引数が増えるだけです。この暗黙引数の受け渡し(の連続)を、オブジェクトの自己同一性として解釈可能となるのですが、これがキモでしょうか。ひょっとして、僕を苛立たせる「現実世界の実体とオブジェクトが自然に対応する」とかいう能書きが、「考えやすさ」の源泉を示しているのでしょうかね。わからんなぁ。