如何压扁一系列的猫' ValidatedNel值

时间:2016-06-12 11:22:24

标签: scala scala-cats

我需要将一系列cats.data.ValidatedNel[E, T]值展平为单个ValidatedNel值:

val results: Seq[cats.data.ValidatedNel[E, T]] = ???

val flattenedResult: cats.data.ValidatedNel[E, T]

我可以这样做:

import cats.std.list._, cats.syntax.cartesian._

results.reduce(_ |@| _ map { case _ => validatedValue })

但是想知道是否存在预先定义的库方法。

1 个答案:

答案 0 :(得分:15)

这取决于你想要如何组合它们(问题中validatedValue是什么?)

import cats.data.{Validated, ValidatedNel}
import cats.implicits._

val validations1 = List(1.validNel[String], 2.valid, 3.valid)
val validations2 = List(1.validNel[String], "kaboom".invalidNel, "boom".invalidNel)

如果要合并T,可以使用使用Foldable.combineAll的{​​{1}}:

Monoid[T]

如果您想获得val valSum1 = validations1.combineAll // Valid(6) val valSum2 = validations2.combineAll // Invalid(OneAnd(kaboom,List(boom))) ,可以使用ValidationNel[String, List[T]]

Traverse.sequence

如果您不关心结果(例如情况),可以使用val valList1: ValidatedNel[String, List[Int]] = validations1.sequence // Valid(List(1, 2, 3)) val valList2: ValidatedNel[String, List[Int]] = validations2.sequence // Invalid(OneAnd(kaboom,List(boom)))

Foldable.sequence_