阐明函数的返回类型作为参数的反方差性质外协变容器的函数



在选项中,我们有

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、 那么如果有些(a(你得到一些(a(.地图(f:B=>??(然后Kaboom

一般来说,我认为我可以接受方差。我没有看到或弄清楚的是,这不是协变和逆变的简单例子作为用例所解释的,我想在这里确认一下:

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

典型的例子是

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

然后我们解释了,不能做,A的反方差立场。我不会重新做完整的解释。让我们假设我们都理解它。

通常没有解释的是:

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

它不仅取a类型的参数,还取返回a的任何函数参数。编译器也会进行详细检查。我想知道它是否到此为止,或者它是否是任何可以产生A的东西,作为Container函数的参数。

您的理解完全正确。老实说,我不确定到底是什么问题,但我认为是——在以下情况下,编译器检查在哪里

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

答案是——所有这些。

因此,当编译器看到trait Container[+A]时,它将检查该Container的主体是否出现了A,看看它们是否在:中

  • 参数位置(这带来了逆变要求(
  • 返回类型位置(协变要求(
  • 二者(不变要求(
  • 两者都没有(所谓的幻影方差(

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

就这么简单。如果是";内部功能";或一个";外部功能";。

相关内容

  • 没有找到相关文章

最新更新