Próbuję użyć sprawdzania poprawności Scalaz 7 w mojej aplikacji. Jednak mam problem z pobieraniem funktora aplikacyjnego |@|
, aby połączyć moje niepowodzenia. Oto kod mam:Scalaz Walidacja za pomocą funktora aplikacyjnego | @ | nie działa
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])(_ |@| _)
}
W minValidate
i sizeValidate
funkcje po prostu wrócić ValidationResults
.
Problem polega na tym, że ten kod nie zostanie skompilowany. Komunikat o błędzie:
Type mismatch, expected F0.type#M[NotInferedB], actual: ValidationResult
Nie mam pojęcia, co to znaczy ... czy muszę podać Scala więcej informacji o typie?
Co staram się osiągnąć, jeśli wszystkie pola są successNel
s, następnie zwrócić, w przeciwnym razie, zwrócić połączenie wszystkich failureNel
s.
Czy zmieniono |@|
od poprzedniej wersji programu Scalaz? Ponieważ, nawet jeśli robię coś takiego:
().successNel |@|().successNel
Otrzymuję ten sam błąd.
Aktualizacja
zacząłem grzebać źródła Scalaz i znalazłem +++
który wydaje się robić to, co chcę.
Jaka jest różnica między +++
i |@|
?