立即折叠和映射 Applicative 的任何技巧

Any trick to fold and map Applicative at once

例如,我有一个简单的代码片段:

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 

你必须在那里使用元组吗?如果你使用 NonEmptyListNonEmptyChain 你可以简单地做

NonEmptyList.of(1.some, 2.some).reduce // Some(3)

NonEmptyList.of(1.some, 2.some).reduceMap(_.getOrElse(0)) // 0

NonEmpty*Traverse.

的任何其他组合

你不能运行完全远离getOrElse。在某些时候,您必须提供一些 Option[Int] => Int 映射,在 foldMapreduceMap 中或在 folding/reduceing 之后。您可以将其替换为 Option 上的 fold 或其他内容,但 Applicative 实用程序不会为您执行此操作,因为退出上下文 F 不是 [=24] 的一部分=] 界面(更像是一个 Comonad)。