如何展平一系列猫的 ValidatedNel 值 [英] How to flatten a sequence of cats' ValidatedNel values
问题描述
我需要将一系列 cats.data.ValidatedNel[E, T]
值展平为单个 ValidatedNel
值:
I need to flatten a sequence of cats.data.ValidatedNel[E, T]
values to a single ValidatedNel
value:
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 })
但是想知道是否存在预定义的库方法.
but wonder if a pre-defined library methods exists.
推荐答案
这取决于你想如何组合它们(你的问题中的 validatedValue
是什么?)
It depends on how you want to combine them (what is validatedValue
in your question ?)
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
s,你可以使用 Foldable.combineAll
它使用一个 Monoid[T]
:
If you want to combine the T
s, you can use Foldable.combineAll
which uses a Monoid[T]
:
val valSum1 = validations1.combineAll
// Valid(6)
val valSum2 = validations2.combineAll
// Invalid(OneAnd(kaboom,List(boom)))
如果你想得到一个ValidationNel[String, List[T]]
,你可以使用Traverse.sequence
:
If you want to get a ValidationNel[String, List[T]]
, you can use 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_
.
If you don't care about the result, which seems to be the case, you can use Foldable.sequence_
.
val result1: ValidatedNel[String, Unit] = validations1.sequence_
// Valid(())
val result2: ValidatedNel[String, Unit] = validations2.sequence_
// Invalid(OneAnd(kaboom,List(boom)))
validations1.sequence_.as(validatedValue) // as(x) is equal to map(_ => x)
这篇关于如何展平一系列猫的 ValidatedNel 值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!