scala - 找不到用于排序的 Traverse Seq[ValidationNel[String, MyCaseClass]] => ValidationNel[String, Seq[MyCaseClass]]

标签 scala functional-programming scalaz

我有一些代码如下:

import scalaz._
import Scalaz._

case class Foo(i: Int)
type ValidatedNel[A] = ValidationNel[String, A]

val foos: Seq[ValidatedNel[Foo]] = Seq(Success(Foo(1)), Success(Foo(2)), Failure(NonEmptyList("3 failed")), Failure(NonEmptyList("4 failed")))

val validated: ValidatedNel[Seq[Foo]] = foos.sequence[ValidatedNel, Foo]

这在编译期间失败并出现此错误:

Error:(51, 50) could not find implicit value for parameter F0: scalaz.Traverse[Seq] val validated: ValidatedNel[Seq[Foo]] = foos.sequence[ValidatedNel, Foo]

Error:(51, 50) not enough arguments for method ToTraverseOps: (implicit F0: scalaz.Traverse[Seq])scalaz.syntax.TraverseOps[Seq,scalaz.package.ValidationNel[String,Foo]]. Unspecified value parameter F0. val validated: ValidatedNel[Seq[Foo]] = foos.sequence[ValidatedNel, Foo]

我想在我给出的示例中得到这样的最终结果:

val validated = Failure(NonEmptyList("3 failed", "4 failed"))

如果 foos 只有 Success 而没有 Failure,我希望看到它们的简单顺序:Success( Foo(1), Foo(2)).

为什么会出现我提到的编译失败?据我了解,这应该基于类型。

这是否与类型别名解包有关 A[B[C[D], E]] => B[C[D, A[E]] 而不是 A[B[C]] => B[A[C]]?

最佳答案

据我所知,scalaz 中没有 Traverse[Seq] 的实例。您可以将 Seq 替换为 List 或对其进行转换,或者实现 Traverse[Seq] (implicit val seqInstance: Traverse[Seq ] = ???).

import scalaz._
import Scalaz._

case class Foo(i: Int)
type ValidatedNel[A] = ValidationNel[String, A]

val foos: List[ValidatedNel[Foo]] = List(Success(Foo(1)), Success(Foo(2)), Failure(NonEmptyList("3 failed")), Failure(NonEmptyList("4 failed")))

val validated: ValidatedNel[List[Foo]] = foos.sequence[ValidatedNel, Foo]

关于scala - 找不到用于排序的 Traverse Seq[ValidationNel[String, MyCaseClass]] => ValidationNel[String, Seq[MyCaseClass]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27113717/

相关文章:

Scala 赋值与引用类型

scala - 将 Iterable[Either[A,B]] 减少到任一个 [A, Iterable[B]]

objective-c - 如何快速转换 valueForKeyPath

language-agnostic - 为什么只可以添加功能语言列表?

scala - Scala 中的 List[Try[T]] 到 Try[List[T]]

scala - 了解 scala 中的中缀行为

scala - akka 非阻塞 BoundedMailbox

functional-programming - 在 Scheme 中访问调用堆栈深度

scalaz:如何处理验证中的不同错误类型?

validation - Scalaz验证和ApplicativeBuilder限制