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) 不符合类型参数的预期种类 (type M,type L,type N)。E 的类型参数与类型 N 的预期参数不匹配:类型 C 的边界 >:Nothing <:B[C] 比类型 L 的声明边界更严格 >:Nothing <:Any,类型 D 的边界 >:Nothing <:A 比类型更严格M 的声明边界 >:Nothing <:Any

val myMap = MyMap.empty[A, T forSome { type T <: B[T] }, E]

感激地收到任何建议。

谢谢 -

4

1 回答 1

2

第二个参数有一个问题,第三个参数有一个问题。我不知道第二个参数,我不确定existentia 在这里可以允许什么。所以这只是第三个参数的问题。

一些更简单的代码具有相同的错误:

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 期望具有两个参数且没有限制的泛型类型作为第三个类型参数。在空的正文中,您可以写字N[Int, String]或任何东西。有一些约束的TypeE与此不兼容(注意:我发现writing N[L,M] 而不是N[_, _],LM前面的类型参数的名称有点误导。或者它可能表明你真的不想要更高阶的类型参数) .

如果你写在上面的代码中

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

然后调用g[C]就可以了(g[List]也可以,因为它应该,那里不会发生任何错误)。

同样,如果为空,您的代码也可以工作(前提是您传递了合适的第二个参数)

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