19

次のものがあるとします。

foo(x: String)(y: Int): Int
foo(x: String)(y: Double): Int

Scalaはそのような表現を許可していません。私が見る限り、これの理由は、foo( "asdf")が明確に定義された型を持っていないためです(Int=>IntまたはDouble=>Intのいずれかです)。

そのような「ポリタイプ」関数が許可されるべきではない理由はありますか?

4

3 に答える 3

23

Scalaでのオーバーロード解決では、最初のパラメーターリストのみが考慮されます。そのため、このリストでは代替案がすでに異なっている必要があります。これには正当な理由があります。解決された関数の型を使用して、後続の引数の型を推測できます。これにより、次のようなイディオムが可能になります。

xs.corresponds(ys) { (x, y) => x < y }

ここで、とのタイプを推測するには、のタイプを知る必要があることに注意してcorrespondsください。過負荷のときにこれが壊れてしまうのは残念です。xycorresponds

于 2011-08-24T21:48:35.080 に答える
2

これが尋ねられたのはこれが初めてではありません:それは2009年に尋ねられました。残念ながら、マーティンは、オーバーロードがどのように機能するかについてかなり大規模な仕様変更が必要になることを除いて、問題が何であるかを明示的に述べていませんでした。私は仕様を調べましたが、主要な問題がどこにあるのかはわかりませんが、どちらの方法でも決定的な答えを出すには、仕様に十分なスキルがありません。

于 2011-08-24T18:14:15.123 に答える
2

簡単な回避策は、匿名オブジェクトを使用することです。

def foo(x: String) = new {
  def apply(y: Int): Int
  def apply(y: Double): Int
}
于 2019-06-28T15:28:39.633 に答える