斯卡拉的位置差异

时间:2016-12-03 18:58:08

标签: scala covariance contravariance

我正在阅读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] UT 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分别有+和 - 符号的规则是什么? "类型嵌套"在标志上有任何作用吗?

如果我错了,请纠正我。

1 个答案:

答案 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个作为逆变,最后一个是协变,MeowFunction3的应用我们可以画一些类型树

type tree http://svgshare.com/i/KQ.svg

树的根是新定义的类型,在您的情况下为class Cat。它可以被理解为其所有成员的产品,因此如果有更多def \ val \ var \ {{}}}成员,type下的节点数量会增加应与Cat[-U, +T]类型

一起绘制

这里我们必须确保协变参数的每次出现都应该有一个"肯定的"路径,即偶数来自根的红/负/协变边缘的数量,并且每次出现的逆变应该具有"负的"奇数红边的路径。

另请注意,可能存在中性路径 - 路径,其中至少出现一个不变类型参数边。该路径必须以不变类型参数或某些不相关类型

结束