scala - 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
?
解决方案
使用 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
推荐阅读
- python - [K(x, fix_elem) for x in my_list] 使用 map() 的等价性
- sql - 如何在r中将变量传递给sqlQuery
- javascript - VueJS v-else 语句多次渲染
- reactjs - 刷新时反应应用程序崩溃[webpack,REACT]
- c# - dotnet pack 使用 template.json 创建的多项目模板
- list - 列表是数据类型还是数据结构?
- python - 如何在同一个项目中使用 C/C++ 和 Python 中的 Cython 函数?
- java - Mockito Junit 5 Throw 检查异常不起作用
- swift - 无法使用 mongodb 同步打开 Realm
- python - 如何正确构造具有单个退出的递归函数?