この問題は私が書いているモジュールで発生しましたが、同じ動作を示す最小限のケースを作成しました。
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
た後、他の出現をT
toNothing
に設定することです。これは明らかに一致しませんapply
。T
最初のパラメーターを削除すると、2 番目のパラメーターが T が定義されていないと不平を言うため、これらは間違いなく同じです。
コンパイラが最初のパラメータを推測できないことを意味するあいまいさがありますか、それともバグですか? これをうまく回避できますか?
詳細情報: このコードは、シンタックス シュガーの試みの簡単な例です。元のコードは、 a がベクトルである|(a)|
のモジュラスを平均化しようとします。書くよりもa
明らかに優れていますが、残念ながらこれを簡単にするために使用することはできません。|(a)|
|[Float,Vector3[Float]](a)|
unary_|
実際のエラー:
推論された型引数 [Nothing,Minimal[Int]] は、メソッド apply の型パラメーターの境界 [T,X <: Sugar.S[T]] に準拠していません