4

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

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

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

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)

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

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

4

1 回答 1

7

标准库和 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的更多信息的情况下,很难说这是否是对析取的合法使用——通常您会在构造函数中捕获有关结果是否失败的信息。

于 2014-06-23T12:56:31.830 回答