Scala 验证 - 右偏 Either

Scala validation - Right-biased Either

Scala 2.12 终于有了右偏 Either。我听说它可以用于验证目的,但我无法想象。我找不到很好的例子。
有人可以解释一下这个 monad 如何帮助我进行验证吗?这个增强的 Either 还可以涵盖哪些其他用例?

Either[A, B] 无论是否偏右都非常适合 validation/exception 处理。使其偏向右使我们更容易对其进行组合操作。

假设我们要验证一个对象,验证方法可以采用哪些形式?最简单的形式是谓词,一种采用任意对象并 returning a 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 的用户,并且我们希望明确说明接收到的对象可能存在的错误,以便用户能够快速了解​​出了什么问题怎么办?

如果不是 return 布尔值,而是 return 错误列表或 return 有效对象本身呢?这将使我们能够进一步组合:

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

我们收获了两件事。首先是将验证与其他操作组合起来并延迟错误处理的能力,其次是显式错误。我们甚至可以更进一步,输入这些错误,允许用户匹配它们并为每个用例应用错误处理,但那是另一次了。