scala - 猫 : mapping over tuples with the same applicative

标签 scala tuples scala-cats applicative either

假设我有:

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

关于scala - 猫 : mapping over tuples with the same applicative,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601870/

相关文章:

scala - 如何在 Scala 中组合 ADT?

java - Intellij 内存不足错误 : PermGenSpace with Scala

debugging - 在 Scala 中调试日志而不影响性能

java - scala maven 插件没有将 scala 文件打包到 jar 中

scala - 如何在 Play Framework 2 中将可选参数传递给 Scala 模板

python - Python中元组和卡住集之间的区别

list - 返回 Haskell 列表中的最后 n 个元素

tuples - 在 Rust 中,如何创建由元组支持的切片?

Scala 和猫 : Implicit conversion to identity monad

scala - 找不到参数 F : cats. Applicative[F] 的隐式值