在选项中,我们有
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
有问题。
就这么简单。如果是";内部功能";或一个";外部功能";。