【发布时间】:2021-03-06 05:42:58
【问题描述】:
在选项中我们有
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 => ???) 然后 Kaboom
一般来说,我认为我可以接受差异。我没有看到或弄清楚什么,因为这不是协变和逆变的简单示例作为用例解释的内容,并且想在此确认:
作为参数的函数的返回类型检查外部容器的方差位置。
典型的例子是
Container[+A] {
def outerfunction[B](value: A): B
}
然后我们解释了,不能做,A 的逆变位置。我不会重新解释为什么。假设我们都理解它。
通常不解释的是:
Container[+A] {
def outerfunction(f: ??? => A): A
}
它不仅采用 A 类型的参数,而且还采用任何返回该 A 的函数参数。编译器也会仔细检查。我想知道它是否停在这里,或者它是否可以产生 A,作为 Container 函数的参数。
【问题讨论】:
-
不确定问题是什么 - WDYM with: " 我想知道它是否停在这里,或者它是否可以产生 A,作为容器函数的参数。" ?
-
一个函数产生一个 A,但我不知道,另一个容器可以看作是 A 的生产者,例如将 LIST[A] 作为参数传递给 Container [+A] 的函数
-
虽然我可以直接测试它,但我只是在想也许我可能不会考虑所有情况。
-
另外我想确认一下,确实是因为参数函数Return A,那个A变成了逆变的。
-
对不起,我还是不明白你在说什么。但我会尽力而为: 1. 虽然您确实可以将任何协变类型构造函数视为生产者,例如返回
As 的函数,并且它们中的大多数都有一个自然的操作,就像function (甚至它们中的大多数都实现了 function trait) 这并不意味着您总是可以传递协变类的实例,其中函数本身是预期的,但创建 lambda 应该是直截了当(这有意义吗?)
标签: scala generics covariance