我有一些代码如下:
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/