在第136页。本书的页面" Scala in Depth"它写道:
但是以下实验表明_
与任意类型参数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
相同。
有人能解释一下这里发生了什么吗?
答案 0 :(得分:2)
M[_]
(即作为类型参数声明)是更高的kinded类型(有时称为“类型构造函数”);正如你所说它与M[X]
相同,_
只是意味着我们不会重复使用这个名称。
在不同的上下文中(例如作为类型),相同的语法有时用于表示存在类型M[X] forSome { type X }
。
令人遗憾和困惑的是语法看起来相同,但它们是两个不同的,不相关的功能。如果您对_
的特定用法是哪一个感到困惑,可以检查编译器/语言功能警告是什么?在我自己的代码中,我尝试总是明确地编写存在类型(使用forSome
)以避免这种混淆,但这只是我提出的,而不是图书馆倾向于遵循的规则。