例如,我有一个简单的代码片段:
import cats.instances.option._
import cats.syntax.option._
import cats.syntax.apply._
val a = 1.some
val b = 2.some
(a, b).mapN(_ + _)
我希望将此折叠为结果或0
有.getOrElse(0)
的替代品吗?
也许是一种:
(a, b).foldN(0)(_ + _) // foldN actually does not exists
你必须在那里使用元组吗?如果你使用NonEmptyList
或NonEmptyChain
,你可以简单地进行
NonEmptyList.of(1.some, 2.some).reduce // Some(3)
或
NonEmptyList.of(1.some, 2.some).reduceMap(_.getOrElse(0)) // 0
或者CCD_ 5或CCD_。
你不能完全逃离getOrElse
。在某些情况下,您必须在foldMap
、reduceMap
中或在fold
ing/reduce
ing之后提供一些Option[Int] => Int
映射。您可以在Option
上用fold
或其他东西替换它,但Applicative
实用程序无法为您做到这一点,因为退出上下文F
不是Applicative
接口的一部分(更像Comonad
(。