作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
鉴于:
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(与
traverse
和
toValidatedNel
),得到一个
ValidatedNel[String, List[T]]
,然后我们处理结果为空的情况(使用
andThen
和
toNel
)。
andThen
可能是您遗漏的部分之一 - 它本质上是
flatMap
为
Validated
(但没有
flatMap
带来的含义和语法糖包)。如果你愿意,你可以很容易地改变我的版本,先做空列表检查,就像你的草图一样,但我写的方式对我来说感觉更自然一些。
Option
的浓缩方法被命名
toValidNel
而对于
Either
是
toValidatedNel
——我之前没有注意到这一点,可能是因为我之前没有在同一行中使用过它们。这似乎很不幸,尤其是因为 Cats 1.0 已经发布,我们已经坚持了一段时间。
-Ypartial-unification
为
traverse
启用编译器选项如果您使用的是 2.11,则无需类型参数即可工作。
关于scala - 将任一列表转换为猫 ValidatedNel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321545/
使用cats.Semigroup可以这样写: import cats.Semigroup import cats.implicits._ val l1: String Either Int = Lef
所以我的网页中有两个字段,一个用于电话号码,另一个用于电子邮件地址,我需要使用 JavaScript 而不是 jQuery 来填写其中之一。我在这里找到的大多数答案都是针对 jQuery 的,任何使用
我有一个类型,它的形状是这样的: val myType: Future[Either[MyError, TypeA]] = // some value 我知道我可以对此进行模式匹配并获得 Right
我的印象是某处有 Either a 的实例,但我似乎找不到它。我尝试导入 Control.Monad、Control.Monad.Instances 和 Data.Either,如图所示 module
我在一个宠物 Scala 项目中遇到了一个我真的不知道如何克服的情况。 以下示例显示了我的问题。 import scala.concurrent.Future import scala.concurr
我是一名优秀的程序员,十分优秀!