[英]Scalaz validation: convert sequence of validations to a single validation
I am using scalaz validation, and have some code to validate products. 我正在使用scalaz验证,并有一些代码来验证产品。
def validateProduct(product: Option[Product]): ValidationNel[String, Product] = ???
Given a list of products, I want to get a single validation containing the whole list as a successful value or a list of validation errors. 给定一个产品列表,我希望得到一个包含整个列表的验证作为成功值或验证错误列表。 It seems like some kind of fold should do it, but I am not sure what the combination function should be. 似乎某种折叠应该这样做,但我不确定组合功能应该是什么。
def validateProducts(products: Seq[Option[Product]]): ValidationNel[String, Seq[Product]] = {
val listOfValidations: Seq[ValidationNel[String, Product]] = products.map(validateProduct _)
val validatedList:ValidationNel[Seq[String], Seq[Product]] = ??? // what to do here?
???
}
Any help is appreciated 任何帮助表示赞赏
If instead of a ValidationNel[List[String], List[Product]]
you want a ValidationNel[String, List[Product]]
(ie, all the failures in the same list), you can just use traverse
: 如果您需要ValidationNel[List[String], List[Product]]
不是ValidationNel[String, List[Product]]
(即同一列表中的所有失败),您可以使用traverse
:
val result: ValidationNel[String, List[Product]] =
products.toList.traverseU(validateProduct)
Note that I've converted the Seq
to a List
as there are no type class instances for raw Seq
, and I'm using traverseU
rather than traverse
as Scala's type inference doesn't quite work for non-trivial type constructors like ValidationNel
请注意,我已经将Seq
转换为List
因为没有原始Seq
类型类实例,并且我使用traverseU
而不是traverse
因为Scala的类型推断对于像ValidationNel
这样的非平凡类型构造函数不太适用
You can use fold with applicative 您可以使用折叠与applicative
import scalaz.syntax.validation._
import scalaz.syntax.applicative._
case class Product(name: String)
val allGood = Seq(
Product("a").successNel[String],
Product("b").successNel[String]
)
val aggregated: ValidationNel[String, Seq[Product]] =
allGood.foldLeft(Seq.empty[Product].successNel[String]) {
case (acc , v) => (acc |@| v)(_ :+ _)
}
println(aggregated)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.