将其中之一的列表转换为猫 ValidatedNel
Converting a list of either to a cats ValidatedNel
鉴于:
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
return 值?
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
s 转换为 Validated
s(使用 traverse
和 toValidatedNel
),得到 ValidatedNel[String, List[T]]
,然后我们处理结果为空的情况(andThen
和toNel
)。
andThen
可能是您遗漏的部分之一——它本质上是 flatMap
用于 Validated
(但没有 flatMap
的含义和语法糖包袱带来)。如果您愿意,您可以很容易地更改我的版本以首先进行空列表检查,就像在您的草图中一样,但我写的方式对我来说感觉更自然一些。
脚注:我不知道为什么 Option
的浓缩方法被命名为 toValidNel
而 Either
的浓缩方法被命名为 toValidatedNel
——我没有注意到这一点之前,可能是因为我之前没有在同一行中使用过它们。这似乎很不幸,特别是因为 Cats 1.0 已经发布,我们已经坚持了一段时间。
另一个脚注:请注意,如果您使用的是 2.11,则需要为 traverse
启用 -Ypartial-unification
编译器选项才能在没有类型参数的情况下工作。
鉴于:
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
return 值?
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
s 转换为 Validated
s(使用 traverse
和 toValidatedNel
),得到 ValidatedNel[String, List[T]]
,然后我们处理结果为空的情况(andThen
和toNel
)。
andThen
可能是您遗漏的部分之一——它本质上是 flatMap
用于 Validated
(但没有 flatMap
的含义和语法糖包袱带来)。如果您愿意,您可以很容易地更改我的版本以首先进行空列表检查,就像在您的草图中一样,但我写的方式对我来说感觉更自然一些。
脚注:我不知道为什么 Option
的浓缩方法被命名为 toValidNel
而 Either
的浓缩方法被命名为 toValidatedNel
——我没有注意到这一点之前,可能是因为我之前没有在同一行中使用过它们。这似乎很不幸,特别是因为 Cats 1.0 已经发布,我们已经坚持了一段时间。
另一个脚注:请注意,如果您使用的是 2.11,则需要为 traverse
启用 -Ypartial-unification
编译器选项才能在没有类型参数的情况下工作。