立即折叠和映射 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
你必须在那里使用元组吗?如果你使用 NonEmptyList
或 NonEmptyChain
你可以简单地做
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
映射,在 foldMap
、reduceMap
中或在 fold
ing/reduce
ing 之后。您可以将其替换为 Option
上的 fold
或其他内容,但 Applicative
实用程序不会为您执行此操作,因为退出上下文 F
不是 [=24] 的一部分=] 界面(更像是一个 Comonad
)。
例如,我有一个简单的代码片段:
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
或 NonEmpty*
或 Traverse
.
你不能运行完全远离getOrElse
。在某些时候,您必须提供一些 Option[Int] => Int
映射,在 foldMap
、reduceMap
中或在 fold
ing/reduce
ing 之后。您可以将其替换为 Option
上的 fold
或其他内容,但 Applicative
实用程序不会为您执行此操作,因为退出上下文 F
不是 [=24] 的一部分=] 界面(更像是一个 Comonad
)。