我正在阅读Scala编程,我想清楚一些关于编译器推断出一个位置是负面的,中立的还是正面的规则以及确切定义为一个位置的规则。
我知道这个问题在这里已被提出很多问题,但阅读这些答案会使我更加困惑。
因此,从书中取出示例并进行一些更改,以便我可以更轻松地表达我的问题。
abstract class Cat[-T, +U] {
def meow[W](par1: T, par2: Cat[U,T], par3: Double): Cat[Cat[U, T], U]
}
所以问题是:
本书最初指定一个位置是代码中可以使用类型参数的每个位置(即T和U都可以),然后指定所有值参数都是位置,这是否意味着{我的例子中的{1}}是一个职位吗?
par3
' s par1
是一个负面立场,因为在外部"范围"一切都是积极的,在方法值参数内,位置的符号变化并取外部范围的相反值。使用相同的推理T
par2
作为一个整体的位置是否定的。我对吗?
Cat[U,T]
U
内T
par2
分别为正数和负数。发生这种情况的原因是由于前一个项目中使用的规则?
在书中还有另一条规则,即在案件中也会发生位置标志翻转:
类型的内部类型参数,例如
Cat[U,T]
中的Arg
,当C[Arg]
的相应类型参数具有使用逆变定义的类型参数时
据我理解,这是指C
定义如下
C
如果这是有效的,因为我理解不应该在前一个子弹的情况下,此规则也适用,因此class C[-T]
par2
有{{{} 1}}的位置被翻转(再次),因为在Cat[U,T]
类定义中,第一个类型参数是用逆变定义的?
现在进入返回类型
U
作为一个整体是积极的,因为没有任何规则或任何说法可以改变标志。与最右边的U相同的逻辑,因为Cat与第二个类型参数协变。
由于子弹4,内部Cat
具有负面位置。
通常情况下,它会通过继承外部范围标志来获得+,但由于子弹4而发生翻转。
返回类型中内部Cat[Cat[U, T], U]
内的Cat[U, T]
和U
分别有+和 - 符号的规则是什么? "类型嵌套"在标志上有任何作用吗?
如果我错了,请纠正我。
答案 0 :(得分:1)
你在形式上提出的所有问题"我是对的吗?"可以回答为"是的你是对的"。 关于类型嵌套的最后一个问题可以回答为
类型嵌套在方差计算中起关键作用
我们可以最小化规则,只需用相应的函数类型替换每个方法类型,因此您的类型可以表示为
abstract class Cat[-T, +U] {
type Meow[W] = (T, Cat[U,T], Double) => Cat[Cat[U, T], U]
def meow[W]: Meow[W]
}
接下来,要了解每个FunctionN
都有N + 1个类型的参数,前N个作为逆变,最后一个是协变,Meow
是Function3
的应用我们可以画一些类型树
type tree http://svgshare.com/i/KQ.svg
树的根是新定义的类型,在您的情况下为class Cat
。它可以被理解为其所有成员的产品,因此如果有更多def
\ val
\ var
\ {{}}}成员,type
下的节点数量会增加应与Cat[-U, +T]
类型
这里我们必须确保协变参数的每次出现都应该有一个"肯定的"路径,即偶数来自根的红/负/协变边缘的数量,并且每次出现的逆变应该具有"负的"奇数红边的路径。
另请注意,可能存在中性路径 - 路径,其中至少出现一个不变类型参数边。该路径必须以不变类型参数或某些不相关类型
结束