假设我有两个可选的 Int(都可以是 Some 或 None):
val one : Option[Int] = Some(1)
val two : Option[Int] = Some(2)
我的问题如下:是否有任何智能方法可以使用 Scalas 出色的集合方法对它们求和?我意识到我可以将它们合并到一个集合中,
flatten
它并使用 reduceLeftOption
像这样:(one :: two :: Nil).flatten.reduceLeftOption(_ + _) // Some(3)
但是,上述解决方案意味着创建一个新系列,并生活在一个富裕而发达的世界中,而我可能会沉浸在所有其他第一世界事件中,而这需要时间。在这样一个编程对我们这样的程序员来说越来越奢侈的世界里,一定有一个或多个奢侈的第一世界答案,对吧?
编辑:所以为了说明问题,这里有一些例子:
如
one = Some(1)
和 two = Some(2)
我们应该有一些(3)如
one = Some(1)
和 two = None
我们应该有一些(1)如
one = None
和 two = Some(2)
我们应该有一些(2)如果两者都
one
和 two
是 None
我们应该没有,因为都没有 one
或 two
可以正确总结。希望澄清事情:-)
最佳答案
强制性 scalaz 答案是使用 scalaz Option monoid:
scala> one |+| two
res0: Option[Int] = Some(3)
它会做你想做的关于 None 的事情:
scala> two |+| None
res1: Option[Int] = Some(2)
scala> none[Int] |+| none[Int]
res2: Option[Int] = None
none 方法是 scalaz 的一个方法,它有助于类型推断,因为它不返回
None <: Option[Nothing]
它返回一个 Option[Int]
, Some 有一个类似的方法,它为任何给定的 A 返回一个 Option[A] 而不是 Some[A]:scala> 1.some |+| 2.some
res3: Option[Int] = Some(3)
关于scala - 总结两个选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16319505/