2016-12-03 43 views
1

我在阅读Scala中的编程,我想清除一些关于编译器推断位置是否定的,中性的或肯定的规则以及确切定义为位置的规则。斯卡拉的位置变化

我知道这个问题已经在这里问了很多,但是阅读这些答案让我更困惑。

因此,从书中的例子,并改变它有点让我可以更容易地表达我的问题。

abstract class Cat[-T, +U] { 
    def meow[W](par1: T, par2: Cat[U,T], par3: Double): Cat[Cat[U, T], U] 
} 

所以问题是:

  • 书中最初指定的位置是一种类型的参数可以被使用的码内的每个点(即到处T和U可以是),后来指定所有值参数都是位置,这是否意味着我的示例中的par3是一个位置?

  • par1T是负的位置,因为在外部‘范围’一切为正,内部方法值参数的位置的符号的改变和取范围外的相对值。同样的推理par2Cat[U,T]作为一个整体的立场是否定的。我对这些吗?

  • UT里面par2Cat[U,T]分别是正数和负数。发生这种情况的原因是因为前一个项目符号中使用的规则?

  • 在这本书中还有另外一个规定说,位置标记牌翻转也发生在情况:

    类型的类型参数,如C[Arg]Arg,当C相应类型的参数有内部型参数与逆变定义

    即我的理解是指如下定义的的情况下C

    class C[-T] 
    

    那么,如果这个工程,我明白不应该在前面的子弹的情况下,这一规则也同样适用,因此具有par2Cat[U,T]U的位置翻转(再次),因为在Cat类定义的第一类参数是用反变量定义的?

现在到返回类型

  • Cat[Cat[U, T], U]作为一个整体是积极的,因为没有规则或任何要说它改变的迹象。与最右边的U相同的逻辑,因为Cat与第二个类型参数是协变的。

  • 内部Cat[U, T]由于子弹4而具有负位置。 正常情况下,它通过继承外部范围标志而具有+,但由于子弹4而发生翻转。

  • T里面的Cat里面的返回类型分别有+和 - 符号的规则是什么? “类型嵌套”是否对标志有任何作用?

请纠正我在哪里我错了。

回答

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个类型参数,WH的第一N ICH作为逆变和最后一个是协变和MeowFunction3的应用,我们可以得出一些类型的树

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

树的根是新在你的情况定义类型,class Cat。它可以被理解为所有成员的产品,所以如果有更多的def \ val \ var \ type成员提出,Cat[-U, +T]下更多的节点应该与Meow类型一起绘制

在这里,我们必须保证每次出现协变参数应该具有“正”的路径,即从根开始的红/负/协变边缘的计数,并且每个逆变的出现应该具有奇数红边的“负”路径。

还要注意,可能存在一个中性路径 - 一条路径,其中至少存在一个不变类型参数边缘。该路径必须以不变类型参数或某些不相关类型结尾

+0

树中的根不应该是Cat [-T,+ U]?你的意思是,而不是事件的权利? – user183833

+0

@ user183833是的,谢谢。请参阅图片后面的段落 – Odomontois