この問題は私が書いているモジュールで生じましたが、私は同じ挙動を示す最小限のケースを作りました。なぜ型推論がここで機能しないのですか?
class Minimal[T](x : T) {
def doSomething = x
}
object Sugar {
type S[T] = { def doSomething : T }
def apply[T, X <: S[T]] (x: X) = x.doSomething
}
object Error {
val a = new Minimal(4)
Sugar(a) // error: inferred [Nothing, Minimal[Int]] does not fit the bounds of apply
Sugar[Int, Minimal[Int]](a) // works as expected
}
問題は、コンパイラはMinimal
(Int
)のための内部パラメータを把握して管理することであるが、その後明らかapply
一致しないNothing
からT
の他の発生を、設定します。これらは明らかに同じT
です。最初のパラメータを削除すると、2番目のパラメータを削除するとTが定義されていないと不平を言うようになります。
コンパイラが最初のパラメータを推論できないという曖昧さがありますか、それともバグですか?私はこれをうまくやっていくことができますか?
詳細情報:このコードは、構文的砂糖の試行の簡単な例です。元のコードでは、|(a)|
は係数がa
であることを意味します。ここで、aはベクトルです。明らかに|(a)|
は|[Float,Vector3[Float]](a)|
と書くよりも優れていますが、残念ながらunary_|
を使用してこれを簡単にすることはできません。
実際のエラー:構造タイプの境界を持ついくつかのすごみがあります
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
はい、このソリューションは私の場合は正常に動作します。それはまたジョシュアの解決策よりもきれいです(申し訳ありませんジョシュア!)。なぜジョシュアのソリューションが機能するのか説明できますか? – Dylan
Joshuaのソリューションがなぜ機能するのかを説明する回答が更新されました。 –