opu*_*111 4 collections scala fold option
我想折叠一个集合或Y并返回一个选项[X].我想从无.开始.像这样...
def f(optX: Option[X], y: Y): Option[X]
val optX = collectionOfY.fold(None) { case (prev, y) => f(prev,y) }
Run Code Online (Sandbox Code Playgroud)
添加不需要的类型以使其更清晰
val optX: Option[X] = collectionOfY.fold(None) { case (prev: Option[X], y: Y) => f(prev,y) }
Run Code Online (Sandbox Code Playgroud)
但是,编译器无法正确计算出类型,我必须像这样编写它
val xx: Option[X] = None
val optX = collectionOfY.fold(xx) { case (prev, y) => f(prev,y) }
Run Code Online (Sandbox Code Playgroud)
写这篇文章的神奇Scala语法是什么?
谢谢彼得
只需使用foldLeft以下任何一项
... foldLeft(Option.empty[X]) ...或... foldLeft(None: Option[X]) ...或... foldLeft[Option[X]](None) ...
毕竟,fold只是打电话foldLeft.你只是真的想要使用fold当你A1真的是超类型的时候A,如果确实如此,你可以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))
Run Code Online (Sandbox Code Playgroud)
最后,如果你确实知道Option[X]将是一个超类型Y然后在类型声明中明确说明Y- 即Y <: Option[X],那么你可以使用fold上面给出的解决方案.
请参阅何时应该使用.empty与单例空实例?进行相关讨论.