2016-06-12 9 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を?):

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

あなたがValidationNel[String, List[T]]を取得したい場合は、あなたが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')の値は検証されている値、つまり' T'です。 – Tvaroh

+0

'combineAll'のように見えます。 'Seq'、btwに' .toList'呼び出しを追加する必要がありました。 – Tvaroh

+0

@Tvarohはい、catsには 'Seq'の型クラスインスタンスがありませんので、' List'か 'Vector'に行く必要があります。 –

関連する問題