如何理解存在类型的类型名称要求?

时间:2014-05-02 15:58:45

标签: scala type-systems existential-type

从这个问题:Sample of `forSome { val `?

我了解到,如果我使用这种存在类型的格式:

type SomeList = List[v.T] forSome { val v : { type T }; }

代码中必须有一个名为T的类型。

但是这段代码:

List[T] forSome { type T }

虽然也有{ type T },但它不需要存在名为T的类型,相反,它可以匹配任何类型。

我无法理解为什么会有这样的差异,我能指望两种{ type T }部分具有完全相同的含义吗?

1 个答案:

答案 0 :(得分:0)

好的,我会尝试一下(虽然存在类型对我来说也很新......)

您的第一个示例使用路径依赖类型v.T,并且表示给定包含名为T的类型的值v,构造其元素具有类型(v.T)的List类型&#34 ;.

你的第二个例子

List[T] forSome { type T }

表示"类型为T的列表,其中T可以是任何类型",并且相当于:

List[_]

(编译器实际上在Eclipse中将类型赋予List[_] .David R. MacIver' s article更详细地讨论了这一点。)

除非你为T

类型添加额外的界限,否则它可能不是很有用

在第一个例子中,我们指的是一个非常具体的命名(路径依赖)类型;在answer to your linked question中,T必须存在并绑定到具体类型,因为我们使用它来访问该类型的值:

object X { 
  type T = String
  val x: T = "hello" 
}

在第二个例子中,我们指的是任何类型。

我认为相同语法的不同含义是由于不同的上下文(路径依赖类型或普通类型)。

另见: