SmalltalkとScalaのトレイトの違い

定期的に話題になる感のあるSmalltalkとScalaのトレイトの違いですが、今回はSmalltalkプログラマの @sumim さんとScalaプログラマの @kmizu さんの対話により、よりわかりやすく整理された内容になっていると思います。
2
リンク はてなダイアリー Scalaのtraitはmixinか? - 西尾泰和のはてなダイアリー Rubyのmixin(モジュール)、Squeakのtrait、Scalaのtraitそれぞれについて: Q1: メソッドの実装を持てる? .. 38 users 2
sumim @sumim

@nishio こういうやつですね(画面ダンプにあるrequiresとかsuppliesとか)→http://t.co/me6Q3Vd4oU プロトタイプで実装されていましたが、結局採用されなかったようです。言語機能というよりはIDEレベルでサポートされる機能のように思います。

2013-03-06 18:15:21
kmizu @kmizu

Scalaのtraitはmixinか? - 西尾泰和のはてなダイアリー (id:nishiohirokazu / @nishio) http://t.co/3rxKXdTzGt

2013-03-06 20:50:16
kmizu @kmizu

@sumim 件のトレイトの記事ですが、他の部分はおいといて、REPLの:powerモードで確認してるのは、sub-type関係であって、class linearlizationの結果ではないので、あれで当然かと。

2013-03-07 23:41:14
kmizu @kmizu

@sumim ScalaのClass Linerizationの仕様については、 http://t.co/8dQWH0AERO の p.56 (cont) http://t.co/Kc9TBab8vb

2013-03-07 23:48:23
kmizu @kmizu

それ以外についてもちょっと議論したいところがあるのですが、ちょっとおいときます。また今度。

2013-03-07 23:49:08
sumim @sumim

@kmizu なんとそうだったんですか。ご指摘痛み入ります。

2013-03-08 00:00:26
sumim @sumim

@kmizu かいつまむとどんなお話でしょうか?

2013-03-08 00:01:43
kmizu @kmizu

ちなみに、Scalaのtraitがoriginalのproposalと違うってのは、2004の「Independently Extensible Solutions to the Expression Pro(cont) http://t.co/QXxCC3GnHO

2013-03-08 00:02:50
kmizu @kmizu

@sumim うーん。ざくっというと、Scalaのtraitはメソッドの実装共有という点だけみると、おおむねmixinに使うためといってよいのですが、かなり初期の頃から、Family Polymorphism≒クラスグループの再利用も目的としていた節があったりして、

2013-03-08 00:28:29
sumim @sumim

@kmizu そのことはもっと徹底して周知されてもいいですね。>Scalaのtraitがoriginalのproposalと違うってのは―Oderskyらは最初の時点でそれは明確にしています。

2013-03-08 00:29:32
kmizu @kmizu

@sumim メソッドの実装共有という点でも、「その時点で継承パスに存在しないメソッドをオーバーライドする」abstract overrideなる機能があったり。いわゆる通常のmixinのための言語機構と比較(cont) http://t.co/YJPybQa1Hq

2013-03-08 00:31:22
kmizu @kmizu

@sumim originalのproposal(ECOOP 2003)が出たのがIndependently…の前年ですし、Oderskyらもその点を明確にしてるのだから、別にそこまで徹底しなくてもいいか、と(cont) http://t.co/Khg1xf5LJY

2013-03-08 00:36:22
kmizu @kmizu

@sumim 「カリー化」とか、アカデミックな分野で一般的になり、コンセンサスが得られている用語の定義を塗りつぶすようなのは私も断固否定しますが…

2013-03-08 00:38:13
sumim @sumim

@kmizu なるほどご不満な点はあらかた分かりました。今度お時間のあるときに色々と教えてください。個人的には「ではなぜSchärliのTraitsを引用したり、そもそもTraitsという名前にしたのか? それにみあう共通項はあるのか? まったくの別物か?」あたりを解消したいです

2013-03-08 01:01:32
kmizu @kmizu

@sumim あ、ちなみに、私も、SqueakやPHPのトレイトがScalaのそれと異なるという点は周知されるのがよいと思っています。

2013-03-08 01:06:21
kmizu @kmizu

@sumim その辺、実は私も整理しきれてないですが、シェルリらのpaperで述べられていたtraitを提案するに至るモチベーションと共通項はあると思っています。何故?に関しては今年のScala Daysで小田好先生に聞いてみるのが早いカモしれません:-)

2013-03-08 01:13:27
kmizu @kmizu

@sumim ちょっと寝る前に、シェルリらの論文で上げられていた"Mixin Inheritance" の問題点をScalaでどのように解決できるかのコードをアップロードしてみました。 https://t.co/8s75VK7VeI

2013-03-08 02:15:33
kmizu @kmizu

@sumim 彼らが挙げているMixinの3つの問題点「Total Ordering」「Dispersal of glue code.」「Fragile hierarchies.(silent overrideしない)」の内、後者二つはScalaではほぼ解決してますね。

2013-03-08 02:19:17
kmizu @kmizu

@sumim 彼らはMixin機構では「composable」な再利用の単位ができないので「Traits」を提案したと認識しています。ScalaのTraitはシェルリらの想定しているMixinとかなり異なっている(Orderingの話の一部を除き)という感じでしょうか。

2013-03-08 02:23:10
kmizu @kmizu

@sumim 彼らの想定していたMixinのモデルでは、superが指す先は決まっていて、線形化の結果で決まってコントロールできないわけですが、Scalaではsuper[T]で、選択的に実装を選べ、かつ、組み合わせることもできるので、その点で既に異なっていると言えそうです。

2013-03-08 02:27:56
kmizu @kmizu

paper読むときは、書かれた当時に著者が定義/想定している用語の定義と、現在の用語の認識でずれが生じている可能性は考えとく必要はありますね、と。

2013-03-08 02:39:06
sumim @sumim

@kmizu ありがとうございます。さすがですね(専門家としてはこの程度の論文読みは楽勝なんでしょうが…^^;)。さしつかえなければ“ほぼ解決”の“ほぼ”の含みを教えていただくことはできますか?

2013-03-08 08:44:04
sumim @sumim

@kmizu 教えていただいたabstract overrideで、件のT0の m から、将来継承パスの上流に来るBのmをsuper.mとして呼べるかなと思ったのですが、やはり(当然ですが)AnyRefにはmが無いと叱られます。Bを予め継承する以外で何か実現方法はありますか?

2013-03-08 08:57:51