在Programming in Scala第 436 页中,作者给出了一个编译器检查每个类型参数是否仅用于适当分类的位置的示例。
abstract class Cat[-T, +U] {
def meow[W^-](volume: T^-, listener: Cat[U^+, T^-]^-) : Cat[Cat[U^+, T^-]^-, U^+]^+
}
这个例子是如何工作的?为什么 W 和第一个 T 得到一个负号?该算法实际上是如何工作的?
在Programming in Scala第 436 页中,作者给出了一个编译器检查每个类型参数是否仅用于适当分类的位置的示例。
abstract class Cat[-T, +U] {
def meow[W^-](volume: T^-, listener: Cat[U^+, T^-]^-) : Cat[Cat[U^+, T^-]^-, U^+]^+
}
这个例子是如何工作的?为什么 W 和第一个 T 得到一个负号?该算法实际上是如何工作的?
http://www.artima.com/pins1ed/type-parameterization.html
19.4 在第一版。
“方法值参数位置相对于方法外的位置分类为翻转分类。”
“除了方法值参数的位置,当前的分类也是在方法的类型参数上翻转的。”
在这种情况下,翻转意味着“从正面翻转”,因此是负面的。
对于奖励积分,生成一个 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[-,+] 说明不翻转。
这个线程为参数(你传入的东西)和结果(你得到的东西)的变化提供了进一步的动力:
https://groups.google.com/forum/#!topic/scala-user/ViwLKfvo3ec
I found the Java discussion and examples (PECS or Naftalin and Wadler) useful background for what Scala provides.