2016-11-01 18 views
3

Iがエラーまたはビューの配列(Seq[Xor[Error,View]]猫配列[Xorの[A、B] => Xorの[A、配列、[B]

を有するIが最初とのXORにこれをマッピングしますエラー(存在する場合)またはビューのシーケンス (Xor[Error, Seq[View]])またはおそらく単純に(Xor[Seq[Error],Seq[View]

どうすればよいですか?

+0

このタイプのメソッドの関数名は 'traversal'の特殊なケースである 'sequence'です。 XorをTraverseに暗黙のうちに変換するものをあなたは信じています。 https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/Traverse.scala –

答えて

5

の構文で提供されているsequenceUを使用できます。これは、scalazの場合と同様です。しかし、Seqの適切な型クラスが存在しないようですが、Listを使用することができます。猫Xorの最新バージョンで

import cats._, data._, implicits._, syntax.bitraverse._ 

case class Error(msg: String) 

case class View(content: String) 

val errors: List[Xor[Error, View]] = List(
    Xor.Right(View("abc")), Xor.Left(Error("error!")), 
    Xor.Right(View("xyz")) 
) 

val successes: List[Xor[Error, View]] = List(
    Xor.Right(View("abc")), 
    Xor.Right(View("xyz")) 
) 

scala> errors.sequenceU 
res1: cats.data.Xor[Error,List[View]] = Left(Error(error!)) 

scala> successes.sequenceU 
res2: cats.data.Xor[Error,List[View]] = Right(List(View(abc), View(xyz))) 
1

削除され、現在は標準のScala Eitherデータ型が使用されています。

マイケルZajacは、あなたが(実際にはないBitraverseTraverse上で定義される)sequenceまたはsequenceUEither[Error, List[View]]を取得するために使用できることを正しく示しました。

import cats.implicits._ 

val xs: List[Either[Error, View]] = ??? 

val errorOrViews: Either[Error, List[View]] = xs.sequenceU 

あなたはsequenceするのではなく、ほとんどの時間を使うことができ、(mapsequenceのようである)traverseで見たいと思うかもしれません。あなたはすべて失敗し、エラーをしたい場合は

、あなたはEitherを使用することはできませんが、Validated[NonEmptyList[A], B]のためだけのタイプの別名であるValidated(またはValidatedNelを、使用することができます。

import cats.data.{NonEmptyList, ValidatedNel} 

val errorsOrViews: ValidatedNel[Error, List[View]] = xs.traverseU(_.toValidatedNel) 

val errorsOrViews2: Either[NonEmptyList[Error], List[View]] = errorsOrViews.toEither 

をあなたはまた、エラーが発生する可能性がありMonadCombine.separateを使用してビュー:

val errorsAndViews: (List[Error], List[View]) = xs.separate 

あなたはの詳細例や情報を見つけることができますCatsのウェブサイトのとValidated

関連する問題