我想折叠一个集合或 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/