scala - 阐明作为参数的函数返回类型的逆变性质是外部协变容器的函数
问题描述
在选项中,我们有
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 函数的参数。
解决方案
你的理解是完全正确的。老实说,我不确定到底是什么问题,但我会假设它是 - 在以下情况下编译器会检查哪些地方:
trait Container[+A] {
def outerfunction(f: String => A): A
}
答案是——所有这些。
因此,当编译器看到 时trait Container[+A]
,它会检查Container
所有出现的A
,看看它们是否在:
- 参数位置(带来逆变要求)
- 返回类型位置(协变要求)
- 两者(不变的要求)
- 两者都不是(所谓的幻象方差)。
在 的情况下Container[+A]
,它将要求所有出现的A
都处于协变位置,这意味着它将与 有问题String => A
。
就这么简单。不管它是“内部功能”还是“外部功能”。
推荐阅读
- php - 使用邮递员的文件导出 HTTP POST 请求不起作用
- c - 如何在另一个数组中声明一个数组而不定义大小
- c# - Ozeki VoIP SDK 捕捉电话的新闻事件
- python - Twitter、tweepy、search_30_day - 与正常外观相比不会产生任何结果
- javascript - 过滤具有反向关系的对象时超出最大调用堆栈大小(领域 10.1.1)
- inno-setup - Inno Setup,[运行]中参数中的空格
- reactjs - 应用程序对此 Web 资源没有足够的权限,无法在 Azure AD B2C 中执行操作
- go - 如何查询gorm中的ManyToMany字段
- amazon-web-services - AWS DynamoDB - 如果我只想按日期查询表,则使用 GSI 或扫描
- sql-server - 从 SSMS(Win 10)连接 Docker 映像中的 SQL Server 会引发错误“现有连接被主机强制关闭”