Scala验证 - 右偏差

时间:2016-12-06 22:13:38

标签: scala functional-programming either

最后,Scala 2.12具有右偏差。我听说它可以用于验证目的,但我无法想象这一点。我无法找到好的榜样 有人可以解释一下这个monad如何帮我验证吗?此增强的Either还可以涵盖其他用例吗?

1 个答案:

答案 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)
}

我们获得了两件事。首先是能够与其他操作组合验证并推迟错误处理,第二个是显式错误。我们甚至可以更进一步,并输入这些错误,允许用户匹配它们并对每个用例应用错误处理,但这又是另一次。