书:Scala in Depth,def foo [M [_]](f:M [Int])= f,这里真的是一个存在主义类型吗?

时间:2015-01-08 15:53:21

标签: scala types type-parameter

在第136页。本书的页面" Scala in Depth"它写道:

enter image description here

但是以下实验表明_与任意类型参数T相同,因此它可能不是存在类型。

scala> def foo[M[_]](f : M[Int]) = f
foo: [M[_]](f: M[Int])M[Int]


scala> def foo[M[T]](f : M[Int]) = f
foo: [M[T]](f: M[Int])M[Int]

另请注意下面Scala语言规范的第4.4节,这也表明此处_T相同。

有人能解释一下这里发生了什么吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

在该上下文中的

M[_](即作为类型参数声明)是更高的kinded类型(有时称为“类型构造函数”);正如你所说它与M[X]相同,_只是意味着我们不会重复使用这个名称。

在不同的上下文中(例如作为类型),相同的语法有时用于表示存在类型M[X] forSome { type X }

令人遗憾和困惑的是语法看起来相同,但它们是两个不同的,不相关的功能。如果您对_的特定用法是哪一个感到困惑,可以检查编译器/语言功能警告是什么?在我自己的代码中,我尝试总是明确地编写存在类型(使用forSome)以避免这种混淆,但这只是我提出的,而不是图书馆倾向于遵循的规则。