我是函数式编程工作的初学者,我有一个 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/