我正在尝试在我的应用程序中使用 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
andsizeValidate
函数只是ValidationResults
返回。
问题是,这段代码无法编译。错误信息是:
Type mismatch, expected F0.type#M[NotInferedB], actual: ValidationResult
我不知道这意味着什么……我需要给 Scala 更多类型信息吗?
我想要完成的是,如果所有字段都是successNel
s,则返回它,否则,返回所有failureNel
s 的组合。
自从|@|
以前版本的 Scalaz 以来发生了变化?因为即使我做了类似的事情:
().successNel |@| ().successNel
我犯了同样的错误。
更新
我开始探索 Scalaz 源代码,发现+++
似乎可以满足我的要求。
+++
和有什么区别|@|
?