我想知道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。在许多情况下,一个简单的
map
– getOrElse
就足够了,尤其是当它涉及可能链接许多map
时。 (当然,尽管您也可以将fun
与功能组合链接在一起,但这取决于您是否要专注于功能组合或值转换。)
关于scala - 为什么Option没有折叠方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5328007/