高级型构造函数有和没有' _'

时间:2014-10-05 16:32:59

标签: scala types higher-kinded-types

此签名声明了更高级别的类型:

case class MyContainer[A, M[_]](el: M[A])

现在,我可以创建它的实例:

scala> val mc1 = MyContainer[Int, Option](Some(3))
mc1: MyContainer[Int,Option] = MyContainer(Some(3))

我也可以将MyContainer声明为:

case class MyContainer[A, M[A]](el: M[A])

生成与mc1相同的实例:

mc1: MyContainer[Int,Option] = MyContainer(Some(3))

这些方法之间有什么区别?哪些方法应该使用?

1 个答案:

答案 0 :(得分:4)

根据语言规范(§4.4类型参数),这些是等效的:

[M[X], N[X]]
[M[_], N[_]] // equivalent to previous clause

本段描述了这种语法背后的原因:

  

高阶类型参数(类型参数t的类型参数)仅在其紧邻的参数子句中可见(可能包括更深嵌套级别的子句)和{{1}的边界}。因此,它们的名称只能与其他可见参数的名称成对地不同。由于高阶类型参数的名称因此通常是不相关的,因此它们可以用t表示,其中无处可见。

请注意,在这种情况下,_中的A会被忽略。它可能是M[A],它也会起作用:

T

为了避免混淆,我总是使用scala> case class MyContainer[A, M[T]](el: M[A]) defined class MyContainer scala> val mc1 = MyContainer[Int, Option](Some(3)) mc1: MyContainer[Int,Option] = MyContainer(Some(3)) ,或者至少不重复使用这些名称。