Я пытаюсь использовать проверку 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 больше информации о типах?
То, что я пытаюсь сделать, это если все поля равны successNel
s, то верните это, в противном случае верните комбинацию всех failureNel
s.
Изменился ли |@|
по сравнению с предыдущей версией Scalaz? Потому что даже если я сделаю что-то вроде:
().successNel |@| ().successNel
Я получаю ту же ошибку.
Обновить
Я начал копаться в исходниках Scalaz и нашел +++
, который, похоже, делает то, что мне нужно.
В чем разница между +++
и |@|
?