0

我写了这段代码

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
}

而不是|@|在每个中间验证上进行并&&在地图内部进行......我可以用更简单的方式编写它吗?我想单独尝试做|@|然后&&使代码看起来有点吓人。(抱歉我还不是绝地武士)

4

1 回答 1

2

您可以使用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(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在0.8.0 版本Xor中放弃了数据类型。Either

于 2017-02-09T01:00:21.590 回答