Sto provando ad usare Scalaz 7 Validation nella mia app. Tuttavia, sto riscontrando un problema nel far funzionare il functor applicativo |@|
per coalizzare i miei errori. Ecco il codice che ho:Validazione scalaz con funtore applicativo | @ | non funziona
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])(_ |@| _)
}
I minValidate
e sizeValidate
funzioni solo restituiscono ValidationResults
.
Il problema è che questo codice non verrà compilato. Il messaggio di errore è:
Type mismatch, expected F0.type#M[NotInferedB], actual: ValidationResult
Non ho idea di cosa significhi ... devo dare a Scala più informazioni di tipo?
Quello che sto cercando di realizzare è, se tutti i campi sono successNel
s, quindi restituire, altrimenti, restituire una combinazione di tutti i failureNel
s.
|@|
è cambiato rispetto alla versione precedente di Scalaz? Perché anche se faccio qualcosa del tipo:
().successNel |@|().successNel
Ho lo stesso errore.
Aggiornamento
ho iniziato rovistando la fonte Scalaz e ho trovato il +++
che sembra fare quello che voglio.
Qual è la differenza tra +++
e |@|
?