scala - 如何将序列函数应用于猫的 ValidatedNel 列表?
问题描述
我有以下代码
sealed trait DomainValidation {
def errorMessage: String
}
type ValidationResult[A] = ValidatedNel[DomainValidation, A]
val ai:ValidationResult[String] = "big".validNel
val bi:ValidationResult[String] = "leboski".validNel
val l = List(ai,bi)
我想转换l
为ValidationResult[List[String]]
. 我遇到了sequence
功能,但我无法使用猫sequence
,因为必须有一些隐含的知道如何处理ValidationResult[A]
。但我无法弄清楚到底需要什么。我写了以下
object helper {
implicit class hello[A](l: List[ValidationResult[A]]) {
def mysequence: ValidationResult[List[A]] = {
val m = l.collect { case Invalid(a) => Invalid(a) }
if (m.isEmpty) l.map { case Valid(a) => a }.validNel
else /* merge the NonEmpty Lists */
}
}
}
我能够做到l.mysequence
。但是我该如何使用猫sequence
。
PS:我是一个Scala初学者。很难学习:)。原谅任何不正确的提及。
解决方案
以下应该在 Scala 2.12 上按预期工作:
import cats.data.ValidatedNel, cats.syntax.validated._
// Your code:
sealed trait DomainValidation {
def errorMessage: String
}
type ValidationResult[A] = ValidatedNel[DomainValidation, A]
val ai:ValidationResult[String] = "big".validNel
val bi:ValidationResult[String] = "leboski".validNel
val l = List(ai,bi)
接着:
scala> import cats.instances.list._, cats.syntax.traverse._
import cats.instances.list._
import cats.syntax.traverse._
scala> l.sequence
res0: ValidationResult[List[String]] = Valid(List(big, leboski))
您没有显示您的代码或解释什么不起作用,因此很难诊断您的问题,但它可能是以下问题之一:
- 您使用的是 Scala 2.11,
.sequence
需要-Ypartial-unification
在编译器选项中启用。如果您使用的是 sbt,您可以通过添加scalacOptions += "-Ypartial-unification"
到您的build.sbt
(假设您使用的是 2.11.9+)来做到这一点。 - 您省略了一项必要的导入。您至少需要
Traverse
for 的实例List
和语法Traverse
。上面的示例代码包括您需要的两个导入,或者您可以只导入cats.implicits._
并让您的生活更轻松一些。
如果这不是这两件事之一,您可能需要在您的问题中包含更多细节,以便我们能够提供帮助。
推荐阅读
- python - 如何在 python 中使用 K 均值识别和分离集群?
- css - 为什么没有应用我的活动标签样式?
- javascript - 无法读取 null 的属性“getAttribute”
- c# - PowerPoint Application .Quit() 导致所有进程关闭
- spring - Spring Security Filter 如何与自定义身份验证一起工作以及如何将其与 Servlet Filter 结合使用?
- postgresql - Azure 函数创建太多与 PostgreSQL 的连接
- c# - 当从 sssms 执行时字段不为空时,来自 sys.check_constraints 的定义列在 ado.net datareader 中为空
- python - 延迟倒计时时钟,直到我更换屏幕
- c++ - boost::enable_if 在成员函数上,重载返回类型
- python - 组合多个数据框列