2016-06-12 6 views
8

Ich brauche eine Folge von cats.data.ValidatedNel[E, T] Werte zu einem einzigen ValidatedNel Wert zu glätten:Wie eine Folge von Katzen ValidatedNel abzuflachen Werte

val results: Seq[cats.data.ValidatedNel[E, T]] = ??? 

val flattenedResult: cats.data.ValidatedNel[E, T] 

ich es wie folgt tun:

import cats.std.list._, cats.syntax.cartesian._ 

results.reduce(_ |@| _ map { case _ => validatedValue }) 

aber frage mich, ob eine vordefinierte Bibliotheksmethode existiert.

Antwort

10

Es hängt davon ab, wie Sie wollen, dass sie kombinieren

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) 

Wenn Sie die T s kombinieren möchten, können Sie Foldable.combineAll verwenden, die verwendet ein Monoid[T] (was validatedValue in Ihrer Frage ist?):

val valSum1 = validations1.combineAll 
// Valid(6) 
val valSum2 = validations2.combineAll 
// Invalid(OneAnd(kaboom,List(boom))) 

Wenn Sie eine ValidationNel[String, List[T]] erhalten möchten, können Sie Traverse.sequenceU verwenden:

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))) 

Wenn Sie sich nicht für das Ergebnis interessieren, das scheint der Fall zu sein, können Sie Foldable.sequenceU_ verwenden.

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) 
+0

Es tut mir leid, 's' in der ursprünglichen Frage (jetzt' validedValue') ist ein Wert, der validiert wird, d.h. 'T'. – Tvaroh

+0

Sieht aus wie 'combinateAll' ist, was ich brauche. Ich musste '.toList' Aufruf auf meiner' Seq', BTW hinzufügen. – Tvaroh

+0

@Tvaroh Ja, Katzen haben keine Typklasseninstanzen für 'Seq', also müssen Sie zu' List' oder 'Vector' gehen. –

Verwandte Themen