【问题标题】:Book: Scala in Depth, def foo[M[_]](f : M[Int]) = f, is _ really an existential type here?书:Scala in Depth, def foo[M[_]](f : M[Int]) = f, _ 这里真的是存在类型吗?
【发布时间】:2015-03-06 19:21:35
【问题描述】:

在“Scala in Depth”一书的第 136 页上写着:

但下面的实验表明这里的_ 与任意类型参数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 相同。

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

【问题讨论】:

    标签: scala types type-parameter


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 2012-02-20
      • 2022-06-13
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2011-01-03
      相关资源
      最近更新 更多