scala - 为什么将 Seq 转换为 Set 然后在同一行上调用 map 无法编译
问题描述
假设我定义了以下代码:
val x: Seq[String] = Seq()
val y = x.toSet.map(s => (s, true))
这不会编译,给我一个缺少参数类型的错误。
但是,如果我这样分解:
val x: Seq[String] = Seq()
val y = x.toSet
val z = y.map(s => (s, true))
它编译得很好。为什么是这样?
解决方案
请注意如何有多种选择适合哪些类型
x.toSet[Any].map[(Any, Boolean]]((s: Any) => (s, true))
x.toSet[AnyRef].map[(AnyRef, Boolean]]((s: AnyRef) => (s, true))
x.toSet[String].map[(String, Boolean]]((s: String) => (s, true))
正如Rex 解释的那样, Scala 2 应该
...选择最具体的值。但是由于函数的参数是逆变的,所以当它们以 an
Any
作为参数时它们是最具体的,因此编译器无法决定。
例如考虑如何因为参数逆变函数Any => _
比String => _
implicitly[(Any => _) <:< (String => _)] // ok
推断Any
从来都不是理想的,因此编译器会向程序员寻求明确的帮助。
现在 Scala 3 似乎已经实现了 Rex 的建议
可能存在打破平局的规则(“更喜欢早期假设”),但没有实施。
这使它编译
scala> Seq.empty[String].toSet.map(s => (s, true))
val res0: Set[(String, Boolean)] = Set()
推荐阅读
- python - 如果语句正确,Python 不会检测到函数循环
- java - 如何使用他的包装类创建一个接受并返回泛型类型的方法
- file-upload - 将文件从 Blazor WebAssembly 应用程序直接上传到 Blob 存储
- python - MariaDB在python中检查连接状态
- python - 创建一个 Numpy 数据集
- javascript - Apexcharts 在工具提示中未显示正确的 x 值
- php - PHP 访问本地文件系统 -> 警告:stat(): stat failed for file:///.../test.txt
- datagridview - 如何避免 datagridrow 突出显示功能在 Null 上爆炸?
- .net - Sharepoint:从 .NET 应用程序中按文件名访问文件。超过 5000 个项目的问题。需要按文件“名称”列索引吗?
- docker - docker swarm 不会将任务分配给新的工作节点