【发布时间】:2015-01-22 16:32:45
【问题描述】:
我有如下代码:
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 验证: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 验证: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]] 有关?
【问题讨论】:
标签: scala functional-programming scalaz