将列表转换为猫ValidatedNel

时间:2018-01-18 12:36:09

标签: 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?

1 个答案:

答案 0 :(得分:7)

我写的如下:

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可能是您遗失的部分之一 - flatMap基本上Validated(但没有flatMap带来的含义和句法含糖行李) 。如果你想要你可以很容易地改变我的版本来进行空列表检查,就像你的草图一样,但是我写的方式对我来说感觉更自然。

脚注:我不知道为什么Option的浓缩方法被命名为toValidNelEither的浓缩方法被toValidatedNel - 我之前没有注意到,可能是因为我以前没有在同一行使用它们。这看起来很不幸,特别是因为我们已经坚持了一段时间,因为Cats 1.0已经出局了。

另一个脚注:请注意,如果您使用2.11,则需要为-Ypartial-unification启用traverse编译器选项才能使用不带类型参数。