首页 > 解决方案 > Cats:映射具有相同应用程序的元组

问题描述

假设我有:

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

标签: scalatuplesscala-catsapplicativeeither

解决方案


使用 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

推荐阅读