无法找到Traverse进行测序Seq [ValidationNel [String,MyCaseClass]] => ValidationNel [String,Seq [MyCaseClass]]

时间:2014-11-24 20:37:05

标签: 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]

在使用此错误进行编译时失败:

  

错误:(51,50)找不到参数F0的隐含值:scalaz.Traverse [Seq]       val validated:ValidatedNel [Seq [Foo]] = foos.sequence [ValidatedNel,Foo]

     

错误:(51,50)方法ToTraverseOps的参数不够:(隐式F0:scalaz.Traverse [Seq])scalaz.syntax.TraverseOps [Seq,scalaz.package.ValidationNel [String,Foo]]。   未指定的值参数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]]

1 个答案:

答案 0 :(得分:2)

AFAIK,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]