scala - 在 Scalaz 中仅累积验证错误

标签 scala scalaz

我是函数式编程工作的初学者,我有一个 ValidationNEL[A,B] 序列,我想将错误累积到一个新的 ValidationNEL[A,B] 中。这取决于B
是来自遗留代码的可变数据结构,因此保存 Seq[B] 会显得过于冗长。

我从其他帖子中了解到,通过序列方法可以累积错误和成功:Processing a list of Scalaz6 Validation

根据我的理解,这一切都需要编写一个合适的 Applicative 和一个合适的 Traverse。

  trait MA[M[_], A] extends PimpedType[M[A]] with MASugar[M, A] {

    def sequence[N[_], B](implicit a: A <:< N[B], t: Traverse[M], n: Applicative[N]): N[M[B]] =
    traverse((z: A) => (z: N[B]))

  def traverse[F[_],B](f: A => F[B])(implicit a: Applicative[F], t: Traverse[M]): F[M[B]] =
    t.traverse(f, value)
  }

我该如何开始?当我试图查看 Scalaz 源代码以找出如何实现我的 Applicative 时,我感到非常困惑。我什至无法找出哪个应用程序允许在验证中累积失败和成功。

最佳答案

迟到了,但从 Scalaz 7.0.4 开始,我们可以这样做:

  def takeLastSuccess[A, B](seq: Seq[ValidationNel[A, B]]) = {
      implicit val useLast = Semigroup.lastSemigroup[B]
      seq reduceLeft (_ +++ _)
  }

关于scala - 在 Scalaz 中仅累积验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14939473/

相关文章:

string - 从字符串列表中删除字符

scala - 未装箱的标记类型安全吗?

scala - 不理解 scalaz 中的行为

scala - 尝试将项目交叉编译到 Scala 2.11 失败,编译器镜像中出现 "error while loading Object, Missing dependency ' 对象 scala'”

scala - 在 Jupyter scala 笔记本中运行 h2o

scala - 如何避免使用 null?

scala - 记录 Play!2 Scala 应用程序的请求时间

Scalaz 状态 monad 示例

list - 为什么 scalaz.NonEmptyList 不支持像 "find"这样的常见列表操作

scala - 是否可以改进 Scala 中部分应用类型的类型推断?