Scala 2.9.2 で特定のより高い種類の型を持つ値を持つマップ ラッパーを作成しようとしていますが、型システムと格闘しています。問題を説明するためのコードの縮小バージョンを次に示します。
trait A
trait B[C] {
def c: C
}
trait E[C <: B[C], D <: A]
case class MyMap[M <: A, L <: B[L], N[L, M]](map: Map[M, N[L, M]])
object MyMap {
def empty[M <: A, L <: B[L], N[L, M]] = MyMap(Map.empty[M, N[L, M]])
}
val myMap = MyMap.empty[A, T forSome { type T <: B[T] }, E]
これをコンパイルしようとすると、最後のステートメントがコンパイラ エラーで失敗し、型の境界が一致していないことが示されます。しかし、私にはそう見えます。おそらく、N[L, M] と以前に L <: B[L] がある場合、N[L, M] の L が同じ L < であると推測していません。 : B[L]、M についても同様です。誤差は次のとおりです。
型引数の種類 (A,T forSome { type T <: B[T] },E) は、期待される型パラメーターの種類 (型 M、型 L、型 N) に準拠していません。E の型パラメーターが型 N の予期されるパラメーターと一致しません: 型 C の境界 >: なし <: B[C] は型 L の宣言された境界よりも厳密です >: なし <: 任意、型 D の境界 >: なし <: A は型よりも厳密ですM の宣言された範囲 >: なし <: あり
val myMap = MyMap.empty[A, T forSome { type T <: B[T] }, E]
どんなアドバイスもありがたく受け取った。
ありがとう -