我想使用 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 专家有什么想法吗?