그것은 당신이 그들을 결합하는 방법에 따라 달라집니다
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)
죄송합니다. 원래 질문 (현재 'validatedValue')의's '는 유효성 검사를받는 값, 즉'T '입니다. – Tvaroh
'combineAll'처럼 보입니다. 내'Seq', btw에'.toList' 호출을 추가해야했습니다. – Tvaroh
@Tvaroh 네, Cat에는'Seq'에 대한 유형 클래스 인스턴스가 없으므로'List' 또는'Vector'로 가야합니다. –