【问题标题】:Can't find Traverse for sequencing Seq[ValidationNel[String, MyCaseClass]] => ValidationNel[String, Seq[MyCaseClass]]找不到 Traverse 进行排序 Seq[ValidationNel[String, MyCaseClass]] => ValidationNel[String, Seq[MyCaseClass]]
【发布时间】: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


    【解决方案1】:

    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]
    

    【讨论】:

    • 如果您在最后一行添加了toList (foos.toList.sequence(...)),则编译器正在寻找scalaz.Traverse[scala.List] 的隐式实例,该实例由scalaz.std.list.listInstance 提供。您使用的是哪个版本的 scalaz?
    • 我正在使用 scalaz 7.1.0 和 scala 2.9.3。导入 listInstance 使其编译。
    猜你喜欢
    • 2018-12-24
    • 2018-09-20
    • 2017-08-27
    • 2022-08-23
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 2020-08-12
    相关资源
    最近更新 更多