【问题标题】:Underscores in type bounds on type constructors类型构造函数的类型边界中的下划线
【发布时间】:2011-09-23 11:46:11
【问题描述】:

有人可以解释为什么以下内容无法编译吗?我希望BB[A] 也是List[A]。方法体仅强制执行此视图。

scala> def x[A, BB[_] <: List[_]](p: BB[A]) {p: List[A]}
<console>:8: error: type mismatch;
 found   : BB[A]
 required: List[A]

       def x[A, BB[_] <: List[_]](p: BB[A]) {p: List[A]}
                                             ^

【问题讨论】:

  • 您使用变量名p 两次是否有原因?首先是BB[A],然后是List[A]?还是我遗漏了一些明显的东西?
  • @agilesteel 更新问题。

标签: scala types type-bounds type-constructor


【解决方案1】:

我认为您需要命名 _ 参数。

scala> def x[A, BB[X] <: List[X]](p: BB[A]) {p: List[A]}

有效。

【讨论】:

  • 确实,BB[_] &lt;: List[_]的定义还有别的意思:BB[x] &lt;: List[T forSome {type T}]_在定义类型参数列表时只定义了一个匿名的高阶类型参数。在所有其他位置,_ 引入了匿名存在类型(如 Java 通配符)。因此,在List[_] 中,_ 用作类型参数(它当然不是为List 定义新的类型参数列表),它成为存在类型。换一种方式想一想:如果你有多个匿名类型参数(都称为_,你会如何分别引用它们?)
  • 我发现像这样的类型占位符使用小写的“名称”有助于提高可读性。甚至不能称之为惯用语,但这肯定是我看到其他人使用的一种趋势。
  • 另外,比较类型和值的级别,很不幸的是类型级别的下划线与值级别的下划线表现不同。在价值层面,_ + _ 确实代表(x, y) =&gt; x + y,一个函数。正如我在其他评论中所暗示的那样,类型级下划线是上下文相关的,它从不引入类型级函数。它要么是匿名类型参数定义,要么是匿名存在。这些都没有价值级别的等价物。
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2010-10-16
  • 2019-09-23
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
相关资源
最近更新 更多