将任一列表转换为猫 验证内尔.



给定:

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库中是否有任何内容可以解释这种情况?或者我是否需要按照以下内容手动执行此操作:将任一列表转换为任一列表的最佳方法?

我会这样写:

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"))

首先,我们将整个事情翻转过来,同时将Eithers转换为Validateds(使用traversetoValidatedNel),以获得ValidatedNel[String, List[T]],然后我们处理结果为空的情况(使用andThentoNel)。

andThen可能是你缺少的部分之一——它本质上对Validated来说是flatMap的(但没有flatMap带来的含义和语法糖包)。如果你愿意,你可能可以很容易地改变我的版本,先做空列表检查,就像在你的草图中一样,但我写它的方式对我来说感觉更自然一些。

脚注:我不知道为什么Option的富集方法被命名为toValidNel,而Either的富集方法却被命名为toValidatedNel- 我以前没有注意到这一点,可能是因为我以前没有在同一行中使用过它们。这似乎很不幸,特别是因为 Cats 1.0 已经出来了,我们已经坚持了一段时间。

另一个脚注:请注意,如果您使用的是 2.11,则需要启用-Ypartial-unification编译器选项,traverse才能在没有类型参数的情况下工作。

最新更新