这取决于您想如何组合它们(在您的问题中,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
,它使用一个 Monoid[T]
:
val valSum1 = validations1.combineAll
val valSum2 = validations2.combineAll
如果您想获取一个
ValidationNel[String, List[T]]
,可以使用
Traverse.sequence
:
val valList1: ValidatedNel[String, List[Int]] = validations1.sequence
val valList2: ValidatedNel[String, List[Int]] = validations2.sequence
如果你不关心结果(看起来是这种情况),你可以使用Foldable.sequence_
。
val result1: ValidatedNel[String, Unit] = validations1.sequence_
val result2: ValidatedNel[String, Unit] = validations2.sequence_
validations1.sequence_.as(validatedValue)
s
(现在是validatedValue
)是一个正在验证的值,即T
。 - TvarohcombineAll
是我需要的。顺便说一下,我需要在我的Seq
上添加.toList
调用。 - TvarohSeq
,cats 没有类型类实例,因此您需要转到List
或Vector
。 - Peter NeyensList[ValidatedNel[String, T]]
的方式,你可以通过使用foldMap(f)
、traverseU(f)
和traverseU_(f)
替换上述函数。 - Peter Neyensas
,则会丢弃结果(Validated
中的List[T]
),因此您可以使用sequence_
/sequenceU_
(在Validated
中返回Unit
)。由于Validated
是类型F[_, _]
,如果您使用sequence_
,Scala 无法自行推断出类型,因此您可以使用sequenceU_
,它使用一些技巧为您推断类型。但是,这将在2.12中得到修复(请参见此PR)。同时,您可以使用此编译器插件,在这种情况下,您可以使用sequence_
。 - Peter Neyens