我有一些代码如下:
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]]
?
答案 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]