gpt4 book ai didi

scala - 如何展平猫的ValidedNel值序列

转载 作者:行者123 更新时间:2023-12-03 23:33:28 24 4
gpt4 key购买 nike

我需要将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 })


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

最佳答案

这取决于您要如何组合它们(问题中的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 
// 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_

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)

关于scala - 如何展平猫的ValidedNel值序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37773658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com