バリデーションに Scalaz を使用したいと考えており、さまざまなコンテキストでバリデーション関数を再利用できるようにしたいと考えています。私はScalazの初心者です。
これらの簡単なチェックがあるとしましょう:
def checkDefined(xs: Option[String]): Validation[String, String] =
xs.map(_.success).getOrElse("empty".fail)
def nonEmpty(str: String): Validation[String, String] =
if (str.nonEmpty) str.success else "empty".fail
def int(str: String): Validation[String, Int] = ...
私は、一方からの出力が他方に供給される検証を構成できるようにしたいと考えています。理解のために、または経由で簡単にそれを行うことができflatMap
ましたが、それよりも良い方法があるに違いないと感じています。
for {
v1 <- checkDefined(map.get("foo"))
v2 <- nonEmpty(v1)
v3 <- int(v2)
v4 <- ...
} yield SomeCaseClass(v3, v4)
また
val x1 = checkDefined(map get "foo").flatMap(nonEmpty).flatMap(int)
val x2 = check(...)
// How to combine x1 and x2?
Scalaz の専門家からの意見はありますか?