簡體   English   中英

Scalaz驗證:將驗證序列轉換為單個驗證

[英]Scalaz validation: convert sequence of validations to a single validation

我正在使用scalaz驗證,並有一些代碼來驗證產品。

def validateProduct(product: Option[Product]): ValidationNel[String, Product] = ???

給定一個產品列表,我希望得到一個包含整個列表的驗證作為成功值或驗證錯誤列表。 似乎某種折疊應該這樣做,但我不確定組合功能應該是什么。

 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?
    ???
  }

任何幫助表示贊賞

如果您需要ValidationNel[List[String], List[Product]]不是ValidationNel[String, List[Product]] (即同一列表中的所有失敗),您可以使用traverse

val result: ValidationNel[String, List[Product]] =
  products.toList.traverseU(validateProduct)

請注意,我已經將Seq轉換為List因為沒有原始Seq類型類實例,並且我使用traverseU而不是traverse因為Scala的類型推斷對於像ValidationNel這樣的非平凡類型構造函數不太適用

您可以使用折疊與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM