假设我有:
val x1: Either[String, Int] = Right(1)
val x2: Either[String, Float] = Left("Nope")
val x3: Either[String, Double] = Left("Not Today")
我想将这些结合起来并得到一个Either[NonEmptyList[String], (Int, Float, Double)]
.为此,我目前正在执行以下操作:
import cats.syntax.all._
(
x1.toValidatedNel,
x2.toValidatedNel,
x3.toValidatedNel
).tupled
.toEither
这可以完成工作,但有点乏味。有没有办法只打电话toValidatedNel
一次?像这样:
(x1, x2, x3)
.fooMap(_.toValidatedNel)
.tupled
.toEither
这样的fooMap
存在于猫的某个地方吗? 还是我们需要HLists
?
使用 Shapeless,它是
import shapeless.syntax.std.tuple._
object toValidatedNel extends Poly1 {
implicit def cse[A, B, AA >: A]: Case.Aux[Either[A, B], ValidatedNel[AA, B]] = at(_.toValidatedNel[AA])
}
(x1, x2, x3)
.map(toValidatedNel)
.tupled
.toEither