読者です 読者をやめる 読者になる 読者になる

multimethodはalgebraではないか?

与太話 下書き虫干し

下書きが腐ってしまいそうなので、以下、メモのままです。すんまそん。

実践common lispより
multimethod

これはいずれのクラスにも属さないメソッドをどこで定義するかというはなし。

これはalgebraとして、クラスをdomainと考えればいいんじゃない?
いずれにしてもdispatch tableで解決するんではなくて、algebraの公理
を定義して、まずdomain(引数のclass)がpre requisiteを満たすことと、
必要な値をgetできることが求められて、その後、演算される。
演算の結果については、それぞれのクラスとは独立の値域(domain)を
とるわけだし

ちうか、オブジェクト指向、というのは、「全てがオブジェクトである」を含意するとは限らない。
これまで存在した「オブジェクト指向」というのがそれだったかもしれないが、
世界=オブジェクト+relation
でもいいわけだ。

algebraは、要素と演算で定義できるし、computingとalgebraの等価性というのは自明に近いので、話をalgebraで考えるべきなんだろう。

では、object指向ってのは、代数的にはどういうattitudeなのであろうか?

要素、というかdomainについて、D x D → Dみたいな演算に限定できるような埋め込みの世界の話になるのだろうか。

なんとなく、檜山さんがこれに関係したエントリを書いているはずだ、という予感。

そして、Alan KeyがSmalltalkに関して、代数的定義を追加しようとしていた、という話を見つけた(2009.12.29)
Smalltalk 勉強会@名古屋 STEPS プロジェクトご紹介 - 言語ゲーム

cited.

Smalltalk で実現出来なかった機能を三つ挙げます。

* 拡張可能文法
* 代数としての多態性
* インターネット的プログラミング

拡張可能文法については先ほどお話しました。多態性とはオブジェクトが種類に応じて一つのメッセージに対して独自に処理を行うという物です。これは大変柔軟なアイデアでしたが、すぐに問題が明らかになりました。メッセージの実装については何の制約も無いので、プログラムを読んで実際の動作が予想出来ないという事が起こります。例えば Smalltalk では演算子の定義が出来るので、ユーザの作ったオブジェクトに加算や乗算を定義する事が出来ます。しかし例えばもしも気まぐれに加算の定義が引き算だったらプログラマは安心してプログラムを組む事が出来ません。

これを解決するには代数的な方法があります。代数では、演算につかうデータ、整数、実数、ベクトル等を気にしないで、演算子同士の関係を使って演算子の性質を定義します。例えば加算と乗算について考えると、おなじみの交換法則や分配法則が挙げられます。演算子が扱うオブジェクトが例え整数であっても複素数であっても、この法則さえ満たせば式だけを見て代数的な変換が出来ます。アランさんは Smalltalk にもこのような制約が必要だと考えていました。

また、Smalltalk のメッセージ送信というメタファを非同期通信に拡張する事も考えられていました。これは単にマルチプロセスを行うという事では無くて、理想としては一台のコンピュータがインターネットのようにシステムを止めずに進化して行く事を目標にしていました。つまり、私たち生物が細胞レベル、個体レベル、生態系レベルでフラクタルな循環系を持つように、コンピュータ内部にもネットワークを持つ事によって強靭なシステムが出来上がると考えたのです。

STEPS プロジェクトには、Smalltalk で実現されなかったこれらのアイデアを復活させようという狙いもあります。

Scalaの本でみつけた文章(2010/1/14追記)

1.2節の「Scalaがスケーラブルな理由」というところで、

関数を表す値はオブジェクトである。関数を表す型は(中略)クラスである

というのに出くわした。algebraと考えるか、型と見るか。なのかー。