ジェネリクスと演算子オーバーロードの話

興味深い話が流れていたのでまとめましたがAPI上限に達してしまったので皆さん好きに加筆してください。
2
なぎせ ゆうき @nagise

演算ってなんなんだろうな。抽象構文木だとオペレーションとオペランドになるんだろうけど

2016-06-09 14:09:54
なぎせ ゆうき @nagise

オブジェクトの環なら環としての操作をすべてジェネリックに記述できる……のだろうか

2016-06-09 14:16:18
kobake⛅🧋 @kobake_

@nagise わからなくもないのですが帰結をジェネリクスにすることにこだわりすぎでは。演算子オーバーロードの応用可能性という点でジェネリクスを視野に入れるのは自然ですが、演算子オーバーロードの存在理由という点では別にジェネリクスを考えないことが視野狭窄だとは思いません。

2016-06-09 14:18:30
なぎせ ゆうき @nagise

そういうのは型の方に情報を持つべきという話になるのかもしれないが

2016-06-09 14:18:44
Takashi Miyamoto @tmiya_

@nagise えーと、Java だと例えば + 記号を任意のクラスでメソッドとして自由に定義できない(scala なら出来る) のが問題だということでしょうか。そこは同意しますが。

2016-06-09 14:21:00
なぎせ ゆうき @nagise

@tmiya_ どうでしょうね。ボクシング方式でも、ラッパー型が演算機能を提供してくれるなら演算子オーバーロードがなくても演算可能なのでは。まあJavaのラッパー型はadd()とか提供しないんですが

2016-06-09 14:22:46
Takashi Miyamoto @tmiya_

@nagise 内部に格納されてる型のメソッドは全て透過的に扱うラッパーのような型を便利に定義する文法要素みたいなものがあると、色々便利な気はしますね。Optional型みたいなものにも便利に使えそうな気がする。

2016-06-09 14:30:11
なぎせ ゆうき @nagise

Javaに演算子オーバーロードがない点を問題視する向きもあるけども、じゃぁ演算子オーバーロード足したらどうなるかって単なる省略記法にしかならないぞ、と。C++のテンプレートみたいな利便性には繋がらないのではないか。

2016-06-09 14:35:35
なぎせ ゆうき @nagise

C++のテンプレート相当というか類似の表現力をJavaに持たせたいというのであれば、単に演算子オーバーロードがあれば良いというわけではなくて…… 今のJavaの実装方式から考えると…… どうすりゃいい?源三郎!

2016-06-09 14:37:45
なぎせ ゆうき @nagise

ラッパー型に演算メソッドを提供して、演算メソッドは関数型インターフェースで提供したらあるいは? うまくいくかしら

2016-06-09 14:39:01
ぐるぐる系SQL @bleis

@nagise Scalaのように、メソッド名に記号を許すようにして、 x.op(y)のシンタックスシュガーとしてx op yを導入するのが一番きれいじゃないでしょうか

2016-06-09 14:54:34
なぎせ ゆうき @nagise

@bleis うーん……。まぁひとつのシンタックスシュガーで対応できるといえばそうなんですが。個人的にはなんか忌避感があるなあ。「Javaとしては」の忌避感ですけどね

2016-06-09 14:59:11
ぐるぐる系SQL @bleis

@nagise 型クラスを用意して型クラスに対する関数として演算子を定義、という形も考えれますけど、それこそJavaとしてはアレな気がします。OOPと演算子オーバーロードを同居させたいなら、Scala方式が(個人的には)一番いい方法だとおもいます。

2016-06-09 15:02:23
Kota Mizushima (on a diet) @kmizu

@nagise Javaっぽいやり方としては、interface Numeric<T> { T plus(other: T): T; } みたいなそのインタフェースを実装しているクラスのみが演算子を使える、とかですかね…。一つの演算子だけオーバーライドしたいときに困りますが

2016-06-09 16:11:58
なぎせ ゆうき @nagise

@kmizu plusなどのメソッドひとつひとつを関数型インターフェースとして用意して、Numericにはそれら演算子を全部implementsしてはどうかと思うのですが

2016-06-09 16:30:42
Kota Mizushima (on a diet) @kmizu

@nagise そうですね。その辺が妥当かもしれません。

2016-06-09 16:39:25