鉴于:
def convert[T](list: List[Either[String, T]]): Validated[NonEmptyList[String], NonEmptyList[T]] =
NonEmptyList.fromList(list)
.toRight("list is empty")
.flatMap(...
Run Code Online (Sandbox Code Playgroud)
我如何平面图NonEmptyList[Either[String, T]]最终我最终得到了我的Validated回报值?
cats库中有什么可以解释这种情况吗?或者我是否需要手动执行以下操作:将Eithers列表转换为列表之一的最佳方法?
我写这个如下:
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"))
Run Code Online (Sandbox Code Playgroud)
首先,我们将整个事物翻转到内部,同时将Eithers 转换为Validateds(使用traverse和toValidatedNel),得到a ValidatedNel[String, List[T]],然后我们处理结果为空(带andThen和toNel)的情况.
这andThen可能是你遗失的部分之一 - 它主要是flatMap为了Validated(但没有带来的影响和语法糖包装flatMap).如果你想要你可能很容易改变我的版本来进行空列表检查,就像你的草图一样,但我写的方式对我来说感觉有点自然.
附注:我不知道为什么富集方法Option命名toValidNel,而一个Either是toValidatedNel-我以前没有注意到这一点,可能是因为我从来没有在同一行之前使用它们.这看起来很不幸,特别是因为我们已经坚持了一段时间,因为Cats 1.0已经淘汰了.
另一个脚注:请注意,如果您使用的是2.11,则需要-Ypartial-unification启用编译器选项才能在traverse没有类型参数的情况下工作.
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |