将A / [A,A]折叠到A

时间:2014-06-23 12:27:51

标签: scala functional-programming scalaz scalaz7

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

在此上下文中,成功和失败由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)

从析取中提取结果,我觉得这很难看。

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

1 个答案:

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