scala - 总结两个选项

标签 scala option scala-collections

假设我有两个可选的 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 = Nonetwo = Some(2)我们应该有一些(2)

如果两者都onetwoNone我们应该没有,因为都没有 onetwo可以正确总结。

希望澄清事情:-)

最佳答案

强制性 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/

相关文章:

scala - Unresolved 依赖 SBT org.scala-sbt#sbt_2.9.1;0.12.1 : not found, Play 示例

scala - 在现有数据框上使用 foldLeft 输出数据框

scala - Scala 中并行集合的效率/可扩展性(图表)

scala - sbt 程序集合并问题 [去重 : different file contents found in the following]

scala - 在 2 个 for 循环中使用 map 和 zip 使其更具功能性

python - 我可以将我的 python/ipython 输入/输出重定向到文本文件吗?

java - 如何将环境变量传递给jar文件?

python - 根据配置选项的Python铃声

scala - Scala 中的平等关系

scala - 匿名函数的参数类型