如何将序列函数应用于猫中的 ValidatedNel 列表?
How to apply sequence function to List of ValidatedNel in cats?
我有以下代码
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+)。
- 您遗漏了其中一项必要的导入。您至少需要
List
的 Traverse
实例和 Traverse
的语法。上面的示例代码包含您需要的两个导入,或者您可以只导入 cats.implicits._
让您的生活更轻松。
如果不是这两件事之一,您可能需要在问题中包含更多详细信息,以便我们能够提供帮助。
我有以下代码
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+)。 - 您遗漏了其中一项必要的导入。您至少需要
List
的Traverse
实例和Traverse
的语法。上面的示例代码包含您需要的两个导入,或者您可以只导入cats.implicits._
让您的生活更轻松。
如果不是这两件事之一,您可能需要在问题中包含更多详细信息,以便我们能够提供帮助。