方差注释,通过Scala编译器跟踪“正”和“负”位置

时间:2012-09-16 23:54:30

标签: scala compiler-construction type-systems variance

Scala编程第436页中,作者给出了编译器检查每个类型参数仅用于适当分类的位置的示例。

abstract class Cat[-T, +U] {
  def meow[W^-](volume: T^-, listener: Cat[U^+, T^-]^-) : Cat[Cat[U^+, T^-]^-, U^+]^+
}

该示例如何解决?为什么W和第一个T得到负号?算法如何实际运作?

1 个答案:

答案 0 :(得分:1)

http://www.artima.com/pins1ed/type-parameterization.html

19.4 in 1st ed。

“方法值参数位置被分类为相对于方法外的位置的翻转分类。”

“除方法值参数位置外,当前分类也会在方法的类型参数中翻转。”

在这种情况下翻转意味着“从正面翻转”,因此是负面的。

对于奖励积分,生成一个LOLcats,说明该模型的物理解释。

补充问答:

Okay let's look at the 3rd value parameter "listener".

It has a annotation of: Cat[U^+, T^-]^-.

Why does U have +? Why does T have -? Why does the whole thing have a -?

方法参数是逆变位置,因此是最外层(最右侧)减去。

Cat的类型参数是[-T,+ U],所以在这个翻转位置,[+, - ]。 (应用的实际参数,[U,T],是无关紧要的。)它检查是因为实际参数分别是共变量和反变量。

更多问题:

Could you kindly describe on SO why the return value type has the following annotation
for the sake of completeness...

Also could you be so kind as to give an example of the following rule?

A classification is sometimes flipped at the type argument position of a type...

此第二个问题与您之前的第一个问题相同。两个Cat [+, - ]表示翻转,结果类型Cat [ - ,+]表示没有翻转。

这个主题为params(你传入的东西)和结果(你得到的东西)的变化提供了进一步的动力:

https://groups.google.com/forum/#!topic/scala-user/ViwLKfvo3ec

我发现Java讨论和示例(PECS或Naftalin和Wadler)是Scala提供的有用背景。