运行副作用并在ValidationNel上返回错误

时间:2016-01-03 22:37:44

标签: scala scalaz

我需要一个组合器,它会对ValidationNel上的成功和返回错误产生副作用。

这是我的第一次尝试:

def runSideEffectAndReturnErrors[E, A](v: ValidationNel[E, A], f: A => Unit) : Seq[E] = v match {
  case Failure(errors) => errors.list
  case Success(a) =>
    f(a)
    Seq.empty[E]
}

这是第二个。它可能在运行时有额外的成本,但我发现它更具可读性并利用现有的组合器。

def runSideEffectAndReturnErrors[E, A](v: ValidationNel[E, A], f: A => Unit) : Seq[E] = {
  v.foreach(f)
  v.fold(_.list, _ => Seq.empty[E])
}
你怎么看?还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于个人品味,但我发现以下内容比其中任何一个版本更好:

import scalaz._, Scalaz._

def RSEaRE[E, A](v: ValidationNel[E, A], f: A => Unit): Seq[E] =
  v.map(f).fold(_.list.toList, _ => Nil)

或者:

def RSEaRE[E, A](v: ValidationNel[E, A], f: A => Unit): Seq[E] =
  v.map(f).swap.map(_.list.toList).getOrElse(Nil)

或者只是:

def RSEaRE[E, A](v: ValidationNel[E, A], f: A => Unit): Seq[E] =
  v.fold(_.list.toList, a => { f(a); Nil })

这与您的第一个版本非常接近。

(请注意,我使用的是7.2.0 - 它看起来像是你的早期版本,在这种情况下你不需要toList。)