我想在我的應用程序中使用Scalaz 7驗證。但是,我遇到了使用|@|
應用函數來解決我的故障的問題。下面的代碼我有:Scalaz驗證與應用函子| @ |不工作
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
我不知道這意味着什麼...我需要給斯卡拉更多的類型信息?
我想要完成的是,如果所有字段都是successNel
s,那麼返回,否則返回所有failureNel
的組合。
已有|@|
自從之前的Scalaz版本發生了變化?因爲即使我這樣做:
().successNel |@|().successNel
我得到同樣的錯誤。
更新
我開始圍繞Scalaz源戳,我發現這似乎做我想做的+++
。
+++
和|@|
有什麼區別?