类型构造函数上的Scala类型边界

zig*_*tar 5 types scala

有人可以解释为什么以下不编译?我想这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]}
                                             ^
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 9

我想你需要命名_参数.

scala> def x[A, BB[X] <: List[X]](p: BB[A]) {p: List[A]}
Run Code Online (Sandbox Code Playgroud)

作品.

  • 实际上,定义`BB [_] <:List [_]`意味着别的东西:`BB [x] <:List [T forSome {type T}]`,`_`只定义一个匿名的高阶类型定义类型参数列表时的参数.在所有其他位置,`_`引入了一个匿名存在类型(如Java通配符).因此,在`List [_]`中,`_`用作类型参数(当然,它没有为`List`定义新的类型参数列表),它变成了一个存在类型.想想另一种方式:如果你有多个匿名类型参数(都叫做`_`,你会如何单独引用它们?) (3认同)
  • 我发现像这样的类型占位符使用小写"名称"有助于提高可读性.不会把它称为惯用语,但它肯定是我见过的其他人所使用的趋势. (2认同)
  • 此外,比较类型和值的级别,非常不幸的是,类型级别下划线与值级别下划线的行为不同。在价值层面,`_ + _` 确实代表`(x, y) =&gt; x + y`,一个函数。正如我在其他评论中所暗示的,类型级下划线是上下文敏感的,它从不引入类型级函数。它要么是匿名类型参数定义,要么是匿名存在。这些都没有价值级别的等价物。 (2认同)