Scala验证 - 右偏差

Paw*_*elN 1 functional-programming scala either

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

Yuv*_*kov 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
}
Run Code Online (Sandbox Code Playgroud)

这会有效,但有时可能还不够.如果这是面向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"))
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以映射它:

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)
}
Run Code Online (Sandbox Code Playgroud)

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