scala - 将任一列表转换为猫 ValidatedNel

标签 scala scala-cats

鉴于:

def convert[T](list: List[Either[String, T]]): Validated[NonEmptyList[String], NonEmptyList[T]] =
  NonEmptyList.fromList(list)
    .toRight("list is empty")
    .flatMap(...

我如何平面映射 NonEmptyList[Either[String, T]]所以最终我得到了我的 Validated返回值?
cats里面有什么吗?库来解释这种情况?或者我是否需要手动执行以下操作:Best way to turn a Lists of Eithers into an Either of Lists?

最佳答案

我会这样写:

import cats.data.{ NonEmptyList, Validated, ValidatedNel }
import cats.instances.list._, cats.syntax.list._
import cats.syntax.either._
import cats.syntax.option._
import cats.syntax.traverse._

def convert[T](list: List[Either[String, T]]): ValidatedNel[String, NonEmptyList[T]] =
  list.traverse(_.toValidatedNel).andThen(_.toNel.toValidNel("list is empty"))

首先,我们在转换 Either 的同时将整个东西翻过来。转至 Validated s(与 traversetoValidatedNel ),得到一个 ValidatedNel[String, List[T]] ,然后我们处理结果为空的情况(使用 andThentoNel )。
andThen可能是您遗漏的部分之一 - 它本质上是 flatMapValidated (但没有 flatMap 带来的含义和语法糖包)。如果你愿意,你可以很容易地改变我的版本,先做空列表检查,就像你的草图一样,但我写的方式对我来说感觉更自然一些。

脚注:我不知道为什么 Option 的浓缩方法被命名 toValidNel而对于 EithertoValidatedNel ——我之前没有注意到这一点,可能是因为我之前没有在同一行中使用过它们。这似乎很不幸,尤其是因为 Cats 1.0 已经发布,我们已经坚持了一段时间。

另一个脚注:请注意,您将需要 -Ypartial-unificationtraverse 启用编译器选项如果您使用的是 2.11,则无需类型参数即可工作。

关于scala - 将任一列表转换为猫 ValidatedNel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321545/

相关文章:

scala - 将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?

scala - s3中的数据分区

scala - 如何在java函数中返回Scala `Unit`类型

scala - 使用免费 Monad 的文件 I/O

scala - 在 scala 中估计 PI 的单子(monad)方法

scala - 使用 Scala Cats 将函数列表应用于值

scala - Spark : Read file only if the path exists

scala - 我如何委派给 Scala 中的成员?

scala - 在 Scala 中实例化赋值运算符两侧的对象;它是如何工作的