运行 ValidationNel 的副作用和 return 错误
run a side effect and return errors on a ValidationNel
我需要一个 运行 成功的副作用和 ValidationNel
的 return 错误的组合器。
这是我的第一次尝试:
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])
}
你怎么看?有没有更好的方法?
这在很大程度上取决于个人品味,但我发现以下版本比这两个版本中的任何一个都好一点:
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
。)
我需要一个 运行 成功的副作用和 ValidationNel
的 return 错误的组合器。
这是我的第一次尝试:
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])
}
你怎么看?有没有更好的方法?
这在很大程度上取决于个人品味,但我发现以下版本比这两个版本中的任何一个都好一点:
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
。)