【发布时间】:2015-03-08 09:36:58
【问题描述】:
假设我需要验证请求参数。验证结果是Success 或Failure 和NonEmptyList[String]。我可能可以使用ValidationNel[String, Unit],但这似乎有点矫枉过正。我想我需要一个更简单的抽象(见下文)。
trait ValidationResult
object Success extends ValidationResult
class Failure(errors: NonEmptyList[String]) extends ValidationResult
和一个二元运算andAlso组合两个结果:
trait ValidationResult {
def andAlso(other: ValidationResult): ValidationResult =
(this, other) match {
case (Success, Success) => Success
case (Success, failure @ Failure(_)) => failure
case (failure @ Failure(_), Success) => failure
case (Failure(errors1), Failure(errors2)) => Failure(errors1 + errors2)
}
}
现在,如果我使用函数 checkA、checkB 和 checkC 验证三个参数,我可以轻松地将它们组合如下:
def checkA(a: A): ValidationResult = ...
def checkB(b: B): ValidationResult = ...
def checkC(c: C): ValidationResult = ...
def checkABC(a: A, b: B, c: C) = checkA(a) andAlso checkB(b) andAlso checkC(c)
这有意义吗?
这个抽象有名字吗?也许是Monoid?
它是在 scalaz 或任何其他 scala 库中实现的吗?
【问题讨论】:
标签: validation scala scalaz