Lau*_*uri 2 validation scala scalaz scalaz7
无法弄清楚是否可以使用Scalaz 7编写类似的内容.我试图用代码块中的注释表达自己.
def validate1(p: String) = ValidationNel[String, Value] = ...
def validate2(p: String) = ValidationNel[String, Value] = ...
validateCombination(p1: String, p2: String) = {
// I would like to write something like
(validate1(p1) |@| validate2(p2)) { (v1, v1) =>
// And validate the combinations here and return successNel of failNel
}
}
def validate(p1: String, p2: String, p3: String) = {
(validateCombination(p1, p2) |@| validate1(p3)) { (v1, v2, v3) =>
// Notice the three parameters I want to have here
}
}
Run Code Online (Sandbox Code Playgroud)
我只是在validateCombinations中遇到了不同类型的令人困惑的编译错误,或者只有2个参数用于我在验证函数中的应用函数,其中一个是ValidationNel [...]类型.
您可以使用.flatMap(identity)in方法validateCombination生成ValidationNel[String, (Value, Value)]和pattern matching在这样的方法validate:
def validateCombination(p1: String, p2: String): ValidationNel[String, (Value, Value)] = {
// I would like to write something like
(validate1(p1) |@| validate2(p2)) { (v1, v1) =>
(v1, v2).successNel[String]
}.flatMap(identity)
}
def validate(p1: String, p2: String, p3: String) = {
(validateCombination(p1, p2) |@| validate1(p3)) { case ((v1, v2), v3) =>
// Notice the three parameters I want to have here
}
}
Run Code Online (Sandbox Code Playgroud)
flatMap(身份)
通常你会使用方法flatten上嵌套的容器来获得M[T]从M[M[T]].它的工作原理上Future,Option,Try,收藏品等.
在这种情况下type M[T] = ValidationNel[String, T].
我不知道为什么没有方法flatten在Validation,但你总是可以使用flatMap(identity)的替代flatten.
比赛
作为本詹姆斯 指出,flatMap上Validation是可疑的.您可以随时使用match而不是它:
(validate1(p1) |@| validate2(p2)) { (v1, v1) =>
(v1, v2).successNel[String]
} match {
case Success(s) => s
case Failure(f) => Failure(f)
}
Run Code Online (Sandbox Code Playgroud)
模式匹配
模式匹配是处理元组的常用方法.例如,它对foldLeft方法有用,例如foldLeft(1 -> 2){ case ((a, b), c) => ??? }.
如果你发现自己使用getter _N,Tuple你可能应该使用模式匹配.
理解
正如Daniel C. Sobral所 指出的那样理解可能更容易理解.
您可以在您的validate方法中使用它,如下所示:
def validate(p1: String, p2: String, p3: String) = {
for{
(v1, v2) <- validateCombination(p1, p2) // pattern matching
v3 <- validate1(p3)
} yield ??? // Your code here
}
Run Code Online (Sandbox Code Playgroud)
它涉及没有case关键字的模式匹配.
请注意,对于理解要求flatMap上validateCombination(p1, p2),所以你从丢失的错误消息validate1(p3)的情况下,validateCombination(p1, p2)是Failure.相反,|@|收集来自双方的所有错误消息.
| 归档时间: |
|
| 查看次数: |
1133 次 |
| 最近记录: |