关于scala方差位置:什么是"封闭参数子句"?

时间:2016-05-26 11:13:23

标签: scala

Why the type position of a method is marked as negative?

在上面的链接中, n.m。回答:

  

方法参数的方差位置与封闭参数子句的方差位置相反。

     

类型参数的方差位置与   封闭式参数子句的方差位置

我不知道封闭参数条款封闭式参数条款是什么。

你可举个例子解释一下吗?

2 个答案:

答案 0 :(得分:1)

  

我不知道封闭参数子句或封闭类型是什么   参数子句是。

规范在陈述关于方差的那些线之前定义了一个重要的公理:

  

让协方差的反面是逆变,而与之相反   不变性本身。 始终是类型或模板的顶级   在协变位置。方差位置在以下变化   构建体。

所以我们从类型参数的初始允许方差是协变的事实开始,现在我们根据特定上下文来回翻转方差(这里是一个例子,还有更多):

  1. 方法参数(从协变到逆变),
  2. 方法的类型参数子句
  3. 类型参数的下限
  4. 如果相应的形式参数是逆变的,则键入参数化类的参数。
  5. 现在让我们再看看这些陈述:

      

    方法参数的方差位置与   封闭参数子句的方差位置。

    这基本上意味着如果我们有一个通用的方法参数,我们就会为它调整方差:

    def m(param: T)
    

    封闭参数子句是在方法m之后和括号内定义的所有内容,在我们的例子中包括param: TT处于逆变位置,因为我们不得不翻转它(记住,所有顶级类型参数都在协变位置开始),这是由于规则(规则1)。

      

    类型参数的方差位置与   封闭式参数子句的方差位置。

    让我们用类型参数定义一个方法:

    def m[T >: U]()
    

    封闭类型参数子句引用方括号[T >: U]。同样,方差因规则而翻转,因此U现在处于逆变位置(规则2)。

    您可以将其视为游戏。你有一个起始状态(协变或正面),然后是一组使位置切换的规则(协变 - >逆变,逆变 - >协变,不变 - >不变)。在游戏结束时,您有一个应用于类型参数的选定状态(位置)。

    blog post以一种可以推理的方式解释事物。

答案 1 :(得分:0)

我想我知道他的意思并试图说明。 鉴于以下先决条件:

trait A
trait B extends A
trait C extends B
val bs: List[B] = List(new B{}, new B{})
val b2b: B => B = identity

List[+T]在其类型参数(包含类型参数子句)中是协变的,但它可分配给(封闭类型子句)的变量类型是逆变的:

val as: List[A] = bs // this is valid
val cs: List[C] = bs // ...and this is not

另一个例子涉及功能。 Function1[-T, +R]在其参数中是逆变的,在其返回类型中是协变的,但在赋值给变量的情况是相反的:

val c2a: C => A = b2b  // this compiles
val a2c: A => C = b2b  // ...and this does not