Dipende da come si desidera combinarli
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)
Se si desidera combinare i T
s, è possibile utilizzare Foldable.combineAll
che utilizza una Monoid[T]
(ciò che è validatedValue
nella tua domanda?):
val valSum1 = validations1.combineAll
// Valid(6)
val valSum2 = validations2.combineAll
// Invalid(OneAnd(kaboom,List(boom)))
Se si desidera ottenere un ValidationNel[String, List[T]]
, è possibile utilizzare Traverse.sequenceU
:
val valList1: ValidatedNel[String, List[Int]] = validations1.sequenceU
// Valid(List(1, 2, 3))
val valList2: ValidatedNel[String, List[Int]] = validations2.sequenceU
// Invalid(OneAnd(kaboom,List(boom)))
Se non ti interessa il risultato, che sembra essere il caso, è possibile utilizzare Foldable.sequenceU_
.
val result1: ValidatedNel[String, Unit] = validations1.sequenceU_
// Valid(())
val result2: ValidatedNel[String, Unit] = validations2.sequenceU_
// Invalid(OneAnd(kaboom,List(boom)))
validations1.sequenceU_.as(validatedValue) // as(x) is equal to map(_ => x)
fonte
2016-06-12 12:31:34
Mi dispiace, 's' nella domanda originale (ora' validatedValue') è un valore che viene validato, ad esempio 'T'. – Tvaroh
Sembra che 'combineAll' è ciò di cui ho bisogno. Avevo bisogno di aggiungere la chiamata '.toList' al mio' Seq', btw. – Tvaroh
@Tvaroh Sì, i gatti non ha istanze di classe tipo per 'Seq', quindi è necessario andare su' List' o 'Vector'. –