scala - 为什么Option没有折叠方法?

标签 scala map fold scala-option

我想知道scala.Option为什么没有像这样定义的fold方法:

fold(ifSome: A => B , ifNone: => B)

相当于
map(ifSome).getOrElse(ifNone)

有没有比使用map + getOrElse好呢?

最佳答案

你可以做:

opt foldLeft (els) ((x, y) => fun(x))

要么
(els /: opt) ((x,y) => fun(x))

(两种解决方案都将按值评估els,这可能不是您想要的。感谢Rex Kerr指出了它。)

编辑:

但是您真正想要的是Scalaz的catamorphism cata(基本上是一个fold,它不仅处理Some值,而且映射了None部分,这就是您所描述的)
opt.cata(fun, els)

定义为(其中value是拉皮条的选项值)
def cata[X](some: A => X, none: => X): X = value match {
  case None => none
  case Some(a) => some(a)
}

等效于opt.map(some).getOrElse(none)

尽管我要指出,只有在cata表示“更自然”时才使用cata。在许多情况下,一个简单的mapgetOrElse就足够了,尤其是当它涉及可能链接许多map时。 (当然,尽管您也可以将fun与功能组合链接在一起,但这取决于您是否要专注于功能组合或值转换。)

关于scala - 为什么Option没有折叠方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5328007/

相关文章:

scala - 如何使用Spark/Scala展平集合?

scala - 分析 Scala Spark 应用程序

c++ - std::map emplace/insert 正在插入的移动值

Kotlin折叠错误 "None of the following functions can be called with the arguments supplied"

javascript - 使用回调的高阶文件夹函数

scala - Spark、Scala 中的数组操作

scala - 匿名函数的参数类型必须是完全已知的。 (SLS 8.5)

java - 另一个 "Can only iterate over an array or an instance of java.lang.Iterable"问题

javascript - 读取 JSON Tiled map 编辑器文件并显示到 Canvas

python - pyspark - 使用 ArrayType 列折叠和求和