【发布时间】:2013-07-17 23:15:41
【问题描述】:
我正在尝试在我的应用程序中使用 Scalaz 7 验证。但是,我在让|@| 应用函子合并我的失败时遇到了问题。这是我的代码:
type ValidationResult = ValidationNel[String, Unit]
def validate[A: ClassTag](instance: A, fieldNames: Option[Seq[String]] = None): ValidationResult = {
val fields = classTag[A].runtimeClass.getDeclaredFields
val fieldSubset = fieldNames match {
case Some(names) => fields.filter { field => names.contains(field.getName) }
case None => fields
}
fieldSubset.map {
field => field.getAnnotations.toSeq.map {
field.setAccessible(true)
val (name, value) = (field.getName, field.get(instance))
field.setAccessible(false)
annotation => annotation match {
case min: Min => minValidate(name, value, min.value())
case size: Size => sizeValidate(name, value, size.min(), size.max())
}
}
}.flatten[ValidationResult].foldLeft(().successNel[String])(_ |@| _)
}
minValidate 和 sizeValidate 函数只返回 ValidationResults。
问题是,这段代码无法编译。错误信息是:
Type mismatch, expected F0.type#M[NotInferedB], actual: ValidationResult
我不知道这意味着什么……我需要给 Scala 更多类型信息吗?
我想要完成的是,如果所有字段都是 successNels,则返回它,否则,返回所有 failureNels 的组合。
|@| 与上一版本的 Scalaz 相比是否发生了变化?因为即使我做了类似的事情:
().successNel |@| ().successNel
我得到同样的错误。
更新
我开始搜索 Scalaz 源代码,发现 +++ 似乎可以满足我的需求。
+++ 和 |@| 有什么区别?
【问题讨论】:
标签: validation scala scalaz scalaz7