首页 > 解决方案 > 阐明作为参数的函数返回类型的逆变性质是外部协变容器的函数

问题描述

在选项中,我们有

def getOrElse[B >: A](default: => B): B = this match {
        case None => default
        case Some(a) => a
    }
def orElse[B >: A](obj: => Option[B]): Option[B] = this match {
        case None => obj
        case _ => this
    }

在要么我们有:

def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B]

我明白发生了什么以及为什么,一个相当扩展的例子可能是这个

OrElse( { Option[B]}).map{....} 如果 B 满足 A :> B,那么如果 Some(a) 你会得到 Some(a).map(f:B => ??? ) 然后是卡布姆

一般来说,我认为我可以接受差异。我没有看到或弄清楚什么,因为这不是协变和逆变的简单示例解释为用例的内容,并且想在这里确认:

函数的返回类型作为参数检查外部容器的方差位置。

通常的例子是

Container[+A] {
  def outerfunction[B](value: A): B
}

然后我们解释了,不能做,A 的逆变位置。我不会重新解释为什么。假设我们都理解它。

通常不解释的是:

Container[+A] {
      def outerfunction(f: ??? => A): A
    }

它不仅采用 A 类型的参数,而且还采用任何返回该 A 的函数参数。编译器也会详细检查它。我想知道它是否停在这里,或者它是否可以产生 A,作为 Container 函数的参数。

标签: scalagenericscovariance

解决方案


你的理解是完全正确的。老实说,我不确定到底是什么问题,但我会假设它是 - 在以下情况下编译器会检查哪些地方:

trait Container[+A] {
  def outerfunction(f: String => A): A
}

答案是——所有这些。

因此,当编译器看到 时trait Container[+A],它会检查Container所有出现的A,看看它们是否在:

  • 参数位置(带来逆变要求)
  • 返回类型位置(协变要求)
  • 两者(不变的要求)
  • 两者都不是(所谓的幻象方差)。

在 的情况下Container[+A],它将要求所有出现的A都处于协变位置,这意味着它将与 有问题String => A

就这么简单。不管它是“内部功能”还是“外部功能”。


推荐阅读