2016-06-12 5 views

답변

10

그것은 당신이 그들을 결합하는 방법에 따라 달라집니다

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] (귀하의 질문에 무엇 validatedValue을?) :

당신이 ValidationNel[String, List[T]]을 얻고 싶은 경우에
val valSum1 = validations1.combineAll 
// Valid(6) 
val valSum2 = validations2.combineAll 
// Invalid(OneAnd(kaboom,List(boom))) 

, 당신은 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))) 

결과에 상관하지 않는 경우 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) 
+0

죄송합니다. 원래 질문 (현재 'validatedValue')의's '는 유효성 검사를받는 값, 즉'T '입니다. – Tvaroh

+0

'combineAll'처럼 보입니다. 내'Seq', btw에'.toList' 호출을 추가해야했습니다. – Tvaroh

+0

@Tvaroh 네, Cat에는'Seq'에 대한 유형 클래스 인스턴스가 없으므로'List' 또는'Vector'로 가야합니다. –