Scalaでの障害処理についてかなりの数の質問を投稿しましたが、本当にありがとうございました。
どちらかとScalazまたは理解のためのを扱うときの私の選択肢を理解しています、そして私は別の(最後の?)質問があります:
操作がDBのような外部の非機能的な世界を処理しているときに、フェイルファストの一連の操作を実行するにはどうすればよいですか?
私はそのような方法を持っていることを意味します:
def insertItem(item: Item): Either[Error,Item]
どちらかとこれらの答えのおかげで、私はどちらかでそれを行う方法を知っています:理解とモナドのために、ScalaでのEitherと メソッドパラメーターの検証を使用したメソッド呼び出しの連鎖
しかし、私のケースクラスは不変であり、呼び出し元がすでに値を持っているため、Item
それをaとして返すことは実際には意味がありません。Right
したがって、どうすれば同じ種類のことを次のように行うことができますか?
def insertItem(item: Item): Option[Error]
私のアプリケーションでは、ユーザーが作成されるときに、そのユーザーのためにいくつかのアイテムも作成します。アイテムの作成に失敗した場合は、プロセス全体を停止する必要があります。
理解のために直接使用するOption[Error]
と、期待した結果が得られないと思います。
私はそのようなことをするのが理にかなっていると思います:
for {
_ <- insertItem(item1).toLeft("???").right
_ <- insertItem(item2).toLeft("???").right
_ <- insertItem(item3).toLeft("???").right
}
しかし、値として「???」私は自分の権利を入れることは決して有用ではありません、私は決して使用されない権利を作成することを含まないエレガントな解決策を見逃していると思います。
結果が出たときだけ理解し続けるものを探していると思いますNone
が、実際の操作ではなく、次の操作を続けたいだけなので、ちょっと変ですmap
。
ちなみに、可能であれば、Scalaz以外のソリューションとScalazソリューションの両方が欲しいです。Scalazがそのようなことを処理するかどうかはわかりません。これは、実際の関数型プログラミングに重点が置かれているようで、おそらく私のユースケースのような副作用動作のコードを提供していないためです。