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 に答える