我希望使用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循环来完成,但感觉应该有更好的方法。
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专家们有什么想法吗?