scala - 以 None 为起始值的折叠集合

标签 scala collections option fold

我想折叠一个集合或 Y 并返回一个 Option[X]。我想从无开始。像这样...

def f(optX: Option[X], y: Y): Option[X]
val optX = collectionOfY.fold(None) { case (prev, y) => f(prev,y) }

添加不需要的类型以使其更清晰
val optX: Option[X] = collectionOfY.fold(None) { case (prev: Option[X], y: Y) => f(prev,y) }

但是,编译器无法正确识别类型,我必须这样写
val xx: Option[X] = None
val optX = collectionOfY.fold(xx) { case (prev, y) => f(prev,y) }

编写这个的神奇 Scala 语法是什么?

谢谢
彼得

最佳答案

只需使用 foldLeft以及以下任何一项
... foldLeft(Option.empty[X]) ...... foldLeft(None: Option[X]) ...... foldLeft[Option[X]](None) ...
毕竟,fold只需调用foldLeft .你只是真的想用fold当您的 A1真的是A的父类(super class)型,如果确实如此,那么您可以使用 fold如上所述,编译器将正确知道类型。

例如,Option[List[Int]] <: Option[Seq[Int]]通过协方差,所以我们没有得到 Any这里:

List(Some(List(1,2,3))).fold[Option[Seq[Int]]](None)((_, _) => Some(Seq(1)))

> res2: Option[Seq[Int]] = Some(List(1))

最后,如果你确实知道Option[X]将是 Y 的父类(super class)型然后在 Y 的类型声明中明确说明这一点- 即 Y <: Option[X] , 那么你可以使用 fold使用上面给出的解决方案。

When should .empty be used versus the singleton empty instance?进行相关讨论。

关于scala - 以 None 为起始值的折叠集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25066863/

相关文章:

scala - 压缩 HList 的推断函数类型

java - Scala vs Java 性能(HashSet 和二元语法生成)

java - 从嵌套集合中检索值

ios - 标题 Collection View 中的分组数据

javascript - 用php和mysql链接选择框

scala - Play : error: not found: value playScalaSettings

scala - 由于 "Invalid memory access of location"导致的 JVM 段错误

java - 为什么红黑树中这两个节点不是黑色的?

scala - 将 1 个元素的列表转换为选项

grails - 如何将选择选项值绑定(bind)到类的属性?