书:深入了解 Scala,def foo[M[_]](f : M[Int]) = f,这里 _ 真的是存在类型吗?

Book: Scala in Depth, def foo[M[_]](f : M[Int]) = f, is _ really an existential type here?

在书的第 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 相同。

谁能解释一下这是怎么回事?

M[_] 在该上下文中(即作为类型参数声明)是更高种类的类型(有时称为 "type constructor");正如您所说,它与 M[X] 相同,_ 只是意味着我们不会重复使用该名称。

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

不幸且令人困惑的是语法看起来相同,但它们是两个不同的、不相关的功能。如果您对 _ 的特定用途感到困惑,也许可以查看 compiler/language 功能警告是什么?在我自己的代码中,我尝试始终明确地编写存在类型(使用 forSome)以避免这种混淆,但这只是我想出的,而不是图书馆倾向于遵循的规则。