将多个验证合并为一个
Merging multiple Validated into single one
我写了这段代码
def valid1() : Validated[List[String], Boolean] = {...}
def valid2() : Validated[List[String], Boolean] = {...}
def valid3() : Validated[List[String], Boolean] = {...}
def valid4() : Validated[List[String], Boolean] = {...}
val consolidated = valid1 |@| valid2 |@| valid3 |@| valid4
consolidated.map{_ && _ && _ && _} match {
case Valid(true) => // do something
case Invalid(errorList) => // do something
}
而不是在每个中间验证上执行 |@|
并在地图内部执行 &&
...我可以用更简单的方式编写它吗?我想单独尝试做 |@|
然后 &&
会让代码看起来有点可怕。 (抱歉我还不是绝地武士)
您可以使用 sequence
(或 sequenceU
)。
import cats.data.{NonEmptyList, Validated}
import cats.implicits._
// import cats.syntax.reducible._
// import cats.syntax.traverse._
val valids = NonEmptyList.of(valid1, valid2, valid3, valid4)
val consolidated: Validated[List[String], Boolean] =
valids.sequenceU.map(_.reduceLeft(_ && _))
Validated[List[String], Boolean]
是一种奇怪的类型,因为它可以表示两种 invalid/false 情况:Invalid(messagesList)
和 Valid(false)
。因为你只是模式匹配 Valid(true)
(不是 Valid(false)
),这也可以建模为 Validated[List[String], Unit]
.
// import cats.syntax.foldable._
val consolidated2: Validated[List[String], Unit] =
valids.traverseU_(_.ensure("was false" :: Nil)(identity))
consolidated2.fold(
errorList => // do something
, _ => // do something
)
对于编译器错误:您可能有另一个使用旧版本 Cats 的依赖项。 Cats 在 version 0.8.0.
中放弃了 Xor
数据类型,取而代之的是 Either
我写了这段代码
def valid1() : Validated[List[String], Boolean] = {...}
def valid2() : Validated[List[String], Boolean] = {...}
def valid3() : Validated[List[String], Boolean] = {...}
def valid4() : Validated[List[String], Boolean] = {...}
val consolidated = valid1 |@| valid2 |@| valid3 |@| valid4
consolidated.map{_ && _ && _ && _} match {
case Valid(true) => // do something
case Invalid(errorList) => // do something
}
而不是在每个中间验证上执行 |@|
并在地图内部执行 &&
...我可以用更简单的方式编写它吗?我想单独尝试做 |@|
然后 &&
会让代码看起来有点可怕。 (抱歉我还不是绝地武士)
您可以使用 sequence
(或 sequenceU
)。
import cats.data.{NonEmptyList, Validated}
import cats.implicits._
// import cats.syntax.reducible._
// import cats.syntax.traverse._
val valids = NonEmptyList.of(valid1, valid2, valid3, valid4)
val consolidated: Validated[List[String], Boolean] =
valids.sequenceU.map(_.reduceLeft(_ && _))
Validated[List[String], Boolean]
是一种奇怪的类型,因为它可以表示两种 invalid/false 情况:Invalid(messagesList)
和 Valid(false)
。因为你只是模式匹配 Valid(true)
(不是 Valid(false)
),这也可以建模为 Validated[List[String], Unit]
.
// import cats.syntax.foldable._
val consolidated2: Validated[List[String], Unit] =
valids.traverseU_(_.ensure("was false" :: Nil)(identity))
consolidated2.fold(
errorList => // do something
, _ => // do something
)
对于编译器错误:您可能有另一个使用旧版本 Cats 的依赖项。 Cats 在 version 0.8.0.
中放弃了Xor
数据类型,取而代之的是 Either