最后,Scala 2.12具有右偏差。我听说它可以用于验证目的,但我无法想象这一点。我无法找到好的榜样 有人可以解释一下这个monad如何帮我验证吗?此增强的Either还可以涵盖其他用例吗?
答案 0 :(得分:5)
Either[A, B]
对于验证/异常处理来说,它是否正确有偏见。使其正确偏向使我们更容易通过它组成操作。
让我们说我们要验证一个对象,验证方法可以采用哪些形式?最简单的形式是谓词,一个采用任意对象并返回Bool
的方法:
sealed trait Base
case class Foo(I: Int)
case class Bar(s: String)
def isValid(b: Base): Bool = b match {
case Foo(i) => i > 18
case Bar(s) => s.length > 5
}
这会有效,但有时可能还不够。如果这是面向API的用户,我们希望明确接收到的对象可能出现的错误,以便用户能够快速了解出现了什么问题?
如果不是返回Bool,我们会返回一个错误列表或返回有效对象本身怎么办?这将使我们能够进一步撰写:
def validate(b: Base): Either[List[String], Base] = b match {
case Foo(i) => if (i > 18) Right(b) else Left(List("i must be greater than 18"))
case Bar(s) => if (s.length > 5) Right(b) else Left(List("s must be longer than 5 chars"))
}
现在我们可以映射它:
val foo = Foo(42)
val result = validate(foo).map { case Foo(i) => s"yay, valid foo number: $i" }
result match {
case Left(errors) => println(s"Something went wrong: ${errors.mkString(", ")})
case Right(msg) => println(msg)
}
我们获得了两件事。首先是能够与其他操作组合验证并推迟错误处理,第二个是显式错误。我们甚至可以更进一步,并输入这些错误,允许用户匹配它们并对每个用例应用错误处理,但这又是另一次。