Ich versuche Scalaz 7 Validierung in meiner App zu verwenden. Allerdings habe ich ein Problem mit dem |@|
Anwendungsfunktor, um meine Fehler zu koaleszieren. Hier ist der Code, den ich habe:Scalaz Validierung mit applicativem Funktor | @ | funktioniert nicht
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])(_ |@| _)
}
Die minValidate
und sizeValidate
Funktionen nur ValidationResults
zurückzukehren.
Das Problem ist, dieser Code wird nicht kompilieren. Die Fehlermeldung lautet:
Ich habe keine Ahnung, was das bedeutet ... muss ich Scala mehr Typ Info geben?
Was ich versuche zu erreichen ist, wenn alle Felder successNel
s sind, dann gebe das zurück, andernfalls gebe eine Kombination aller failureNel
s zurück.
Hat sich |@|
seit der vorherigen Version von Scalaz geändert? Denn selbst wenn ich etwas mache wie:
().successNel |@|().successNel
bekomme ich den gleichen Fehler.
aktualisieren
begann ich um die Scalaz Quelle Stossen und ich fand die +++
das, was zu tun scheint, ich will.
Was ist der Unterschied zwischen +++
und |@|
?