加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:28:20 所属栏目:安全 来源:网络整理
导读:在Scala编程第436页中,作者给出了编译器检查每个类型参数仅用于适当分类的位置的示例. abstract class Cat[-T,+U] { def meow[W^-](volume: T^-,listener: Cat[U^+,T^-]^-) : Cat[Cat[U^+,T^-]^-,U^+]^+} 该示例如何运作?为什么W和第一个T得到负号?算法如
在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

第1版19.4.

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

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

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

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

附加Q& A:

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提供的有用背景.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读