在网络应用程序中,我有一个可能以各种不同方式失败的行动,或最终成功。
在此上下文中,成功和失败由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)
从析取中提取结果,我觉得这很难看。
是否有一些抽象可以捕获这种“明显可简化的结构”?或者也许是分离不是这个问题的正确抽象?
答案 0 :(得分: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
的情况下,很难说这是否是对析取的合法使用 - 通常您会在构造函数中捕获有关结果是否失败的信息。