猫Seq [Xor [A,B]] => Xor [A,Seq [B]]

Ben*_*ers 4 scala scala-cats

我有一系列的错误或观点(Seq[Xor[Error,View]])

我想将此映射到第一个错误的Xor(如果有)或视图序列(Xor[Error, Seq[View]])或可能只是(Xor[Seq[Error],Seq[View])

我怎样才能做到这一点?

Mic*_*jac 7

您可以使用语法sequenceU提供的bitraverse,类似于您对scalaz的处理方式.Seq尽管如此,它似乎不是正确的类型类,但您可以使用List.

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)))
Run Code Online (Sandbox Code Playgroud)