2

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]

どんなアドバイスもありがたく受け取った。

ありがとう -

4

1 に答える 1

2

2 番目のパラメーターに 1 つ、3 番目のパラメーターに 1 つの問題があります。2 番目のパラメーターについてはわかりません。existentia で何が許可されるかわかりません。したがって、これは 3 番目のパラメーターの問題にすぎません。

同じエラーの少し単純なコード:

class A {}

class C[X <: A] {}

def f[X[_]] = 12

f[List]
res1: Int12
f[C]
error: kinds of the type arguments (C) do not conform to 
the expected kinds of the type parameters (type X).
C's type parameters do not match type X's expected parameters: 
    type X's bounds >: Nothing <: A are stricter 
    than type _'s declared bounds >: Nothing < : Any
       f[C]
         ^

簡単に言えば、メソッド empty は、3 番目の型パラメーターとして、2 つのパラメーターを持ち、制限のないジェネリック型を想定しています。空の本文には、何を書いてもかまいませんN[Int, String]。いくつかの制約があるTypeEは、これと互換性がありません (注: 、 withwriting N[L,Mではなく ]を見つけ、前の型パラメーターの名前は少し誤解を招く可能性があります。または、より高次の型パラメーターが本当に必要ないことを示唆している可能性があります)。 .N[_, _]LM

上のコードで書くと

def g[X[_ <: A]] = 13

その後、呼び出しg[C]は問題ありません(g[List]問題はありませんが、問題は発生しません)。

同様に、empty が

Map.empty[M <: A, L <: B[L], N[X <: B[X], Y <: A]]
于 2012-10-12T17:50:43.080 に答える