使用fold的选项[Int]Scala的总和列表

使用fold的选项[Int]Scala的总和列表,scala,functional-programming,fold,Scala,Functional Programming,Fold,我试图对列表中的所有元素求和,它们的类型为Option[Int],如果其中任何一个元素为None,则整个结果为None,如果所有元素都是某个(值),则我需要所有元素的和: val ls = List(Some(2), Some(5), Some(4), Some(1)) ls.fold(None)((rs,x) => for(n <- x; m <- rs) yield {n+m}) val ls=List(一些(2),一些(5),一些(4),一些(1)) ls.fold(

我试图对列表中的所有元素求和,它们的类型为Option[Int],如果其中任何一个元素为None,则整个结果为None,如果所有元素都是某个(值),则我需要所有元素的和:

val ls = List(Some(2), Some(5), Some(4), Some(1))

ls.fold(None)((rs,x) => for(n <- x; m <- rs) yield {n+m})
val ls=List(一些(2),一些(5),一些(4),一些(1))

ls.fold(None)(rs,x)=>对于(n我意识到我的错误是什么,这是fold中的基本情况:

val ls = List(Some(2), Some(5), Some(4), Some(1))

ls.fold(Some(0))((rs,x) => for(n <- x; m <- rs) yield {n+m})
val ls=List(一些(2),一些(5),一些(4),一些(1))

ls.fold(Some(0))((rs,x)=>for(n首先使用forall检查是否定义了所有值,然后应用fold获得sum(如果定义了其他值,则没有)

scala> val ls = List(Some(2), Some(5), Some(4), Some(1))
ls: List[Some[Int]] = List(Some(2), Some(5), Some(4), Some(1))

scala> if(ls.forall(_.isDefined)) Some(ls.flatten.foldLeft(0){_ + _ }) else None
res22: Option[Int] = Some(12)

scala> val ls = List(Some(2), None,Some(5), Some(4), Some(1),None)
ls: List[Option[Int]] = List(Some(2), None, Some(5), Some(4), Some(1), None)

scala> if(ls.forall(_.isDefined)) Some(ls.flatten.foldLeft(0){_ + _ }) else None
res23: Option[Int] = None

scala>
也可以尝试以下方法:


如果列表中的任何单个值为
None
,则
sum
报告为
None
;否则-如果定义了所有值-您将得到一个
Some
,其中包含元素之和。如果列表为空,则您将得到
Some(0)
作为结果。

您可以这样做,并且只返回一个
Int
。这也避免了在
列表上多次迭代

val foo = List(Some(1), Some(2), None, Some(3))

foo.foldLeft(0)((acc, optNum) => acc + optNum.getOrElse(0))
只是:

甚至

(0 /: ls) (_ + _.getOrElse (0))

嘿,我非常喜欢它,加上一个。我会尝试一下,看看我是否也能理解它,你是说我的版本带有右折叠吗?@Damianalattenero是的。这两个答案是等价的。是的,我可以看到,我喜欢带有平面图和地图的变体,有趣的是不,我不想要整数结果,我想要一个选项[Int]结果,检查我的答案或左下角的答案,你会更好地理解我的问题,所以你想要一些(总和)的ans,如果定义了其他ans?类似的,如果只有一个是None,所有都是None,如果所有都是sone(结果)。看一看!现在好了,很好!谢谢你展示另一个选择!加上一个
ls.foldLeft (0) (_ + _.getOrElse (0))
(0 /: ls) (_ + _.getOrElse (0))