gpt4 book ai didi

scala - 折叠\/[A,A] 到 A

转载 作者:行者123 更新时间:2023-12-04 23:50:11 26 4
gpt4 key购买 nike

在 Web 应用程序中,我有一个操作可能会以各种不同的方式失败,或者最终会成功。

在这种情况下,成功和失败由 SimpleResult 的子类表示(表示 HTTP 响应)

我使用 scalaz/上的 monadic 操作来编码我的算法,例如:

val result = for {
user <- fetchUser \/> Forbidden("you must be connected to perform this action")
basket <- user.basket \/> NotFound("no basket !")
...
} yield Ok(someBasketView(user, basket))

所以这最终是一个 SimpleResult \/ SimpleResult我必须这样写:
 result fold (identity, identity)

从析取中提取结果,我觉得这很丑陋。

是否有一些抽象可以捕捉到这种“明显简化的结构”?或者也许析取不是这个问题的正确抽象?

最佳答案

标准库和 Scalaz 都将此操作提供为 merge :

scala> val e: Either[String, String] = Right("a")
e: Either[String,String] = Right(a)

scala> e.merge
res0: String = a

和:
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> val ez: String \/ String = "a".right
ez: scalaz.\/[String,String] = \/-(a)

scala> ez.merge
res1: String = a

在不了解您的情况下 SimpleResult很难说这是否是对析取的合法使用——通常您会在构造函数中捕获有关结果是否失败的信息。

关于scala - 折叠\/[A,A] 到 A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24365943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com