validation - 处理 Scalaz6 验证列表

标签 validation scala scalaz

是否有一种惯用的方法来处理 Scalaz6 中的验证集合?

val results:Seq[Validation[A,B]]
val exceptions = results.collect{case Failure(exception)=>exception}
exceptions.foreach{logger.error("Error when starting up ccxy gottware",_)}
val success = results.collect{case Success(data)=>data}
success.foreach {data => data.push}
if (exceptions.isEmpty)
   containers.foreach( _.start())

我可以考虑在循环结果时使用折叠,但最终测试呢?

最佳答案

处理验证列表的常用方法是使用 sequence将列表变成 Validation[A, List[B]] ,如果一路上有任何错误,它将是空的(即 Failure )。

测序 Validation在左手类型的半群中累积错误(与 Either 相反,后者立即失败)。这就是为什么你经常看到ValidationNEL (其中 NEL 代表 NonEmptyList )代替简单的 Validation 使用.例如,如果您有以下结果类型:

import scalaz._, Scalaz._

type ExceptionsOr[A] = ValidationNEL[Exception, A]

和一些结果:
val results: Seq[ExceptionsOr[Int]] = Seq(
  "13".parseInt.liftFailNel, "42".parseInt.liftFailNel
)

测序将为您提供以下信息:
scala> results.sequence
res0: ExceptionsOr[Seq[Int]] = Success(List(13, 42))

另一方面,如果我们有这样的错误:
val results: Seq[ExceptionsOr[Int]] = Seq(
  "13".parseInt.liftFailNel, "a".parseInt.liftFailNel, "b".parseInt.liftFailNel
)

我们最终会得到一个 Failure (请注意,我已重新格式化输出以使其在此处清晰易读):
scala> results.sequence
res1: ExceptionsOr[Seq[Int]] = Failure(
  NonEmptyList(
    java.lang.NumberFormatException: For input string: "a",
    java.lang.NumberFormatException: For input string: "b"
  )
)

所以在你的情况下,你会写这样的东西:
val results: Seq[ValidationNEL[A, B]]

results.sequence match {
  case Success(xs) => xs.foreach(_.push); containers.foreach(_.start())
  case Failure(exceptions) => exceptions.foreach(
    logger.error("Error when starting up ccxy gottware", _)
  )
}

查看我的回答 herehere更多详情 sequence和关于 Validation更普遍。

关于validation - 处理 Scalaz6 验证列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14233511/

相关文章:

Javascript 验证错误,无法提交表单

scala - Spark 对 RDD 进行排序并加入他们的行列

scala - 从 scalaz 导入 `IO`

validation - Xamarin MvvmCross ViewModel 验证

javascript - 只允许一定数量的数字作为小数整数和一定数量的小数的函数

scala - 依靠 Spark Dataframe 的速度非常慢

unit-testing - 如何让 HBaseTestingUtility 在 map reduce 作业中查找类?

scala - 如何使用 Scalaz 或 Cats 重构抛出异常的函数

scala - 创建状态转换以将集合元素添加到 Map[K, Set[V]] 的更好方法

laravel - 如何验证 REST Lumen/Laravel 请求中的参数?