将值提升到ValidationNel

时间:2016-01-03 22:05:49

标签: scala scalaz

给定值和谓词,如何创建ValidationNel

这是我的代码:

def toValidationNel[A, E](a: A)(f: A => Boolean, fail: => E) : ValidationNel[E, A] =
  if (f(a)) fail.failureNel[A] else a.successNel[E]

scalaz中是否有现有的组合器?

2 个答案:

答案 0 :(得分:1)

您可以使用scala.util.Either中的Either.cond

import scalaz.ValidationNel
import scalaz.syntax.std.either._
import scalaz.syntax.nel._

def toValidationNel[A, E](a: A)(f: A => Boolean, fail: => E) : ValidationNel[E, A] =
  Either.cond(f(a), a, fail.wrapNel).validation

答案 1 :(得分:1)

Scalaz包含一个either扩展方法,用于与Either.cond类似的布尔值但可以说更好一点:

import scalaz._, Scalaz._

def toValNel[A, E](a: A)(f: A => Boolean, fail: => E) : ValidationNel[E, A] =
  f(a).either(a).or(fail.wrapNel).validation

我从来没有真正喜欢Either.cond的右侧出现在左侧的事实,Scalaz的版本让我或者眼睛更清楚一点,但它对人们来说也可能更难不熟悉Scalaz的人一眼就能理解。不过,我认为没有任何理由比较喜欢一个。