2017-03-08 5 views
2

ich versuche scalaz Validierung zu lernen, und da dieses Stück Code:Scalaz Validierung NEL mkString

  AuthorValidator.validate(author) match { 
      case scalaz.Success(authorValidated) => onSuccess(authorService.addAuthor(authorValidated)) { extract: Int => 
       complete(StatusCodes.OK -> extract+"") 
       } 
      case scalaz.Failure(failure) => complete(StatusCodes.Accepted, failure mkString "/") // this piece won't work 
      } 
     } 

ich von failure : NonEmptyList[String] formatierten String erhalten möchten. Grundsätzlich kann ich mkString nicht verwenden. Weißt du, ob Scalaz eine Möglichkeit bietet, NEL zu formatieren?

+1

Vielleicht möchten Sie sich die 'Show'Typenklasse http://eed3si9n.com/learning-scalaz/Show.html ansehen – michaJlS

+1

OK Vielen Dank, ich ging in den letzten paar Tagen durch scalaz und ich kann einfach nicht Erinnere dich an alles :) –

+0

Ich würde empfehlen, die Klasse 'Show' nicht zu verwenden, da' NonEmptyList [String] 'bereits eine Instanz hat und nicht das tut, was Sie wollen. Im Allgemeinen würde ich "Show" nur zum Debuggen verwenden, nicht zum Präsentieren von Daten für Benutzer. –

Antwort

2

A NonEmptyList ist nur eine Liste mit einer zusätzlichen Garantie (Nicht-Leere), so können Sie immer sicher ein zu einem gewöhnlichen Scala List konvertieren, um Methoden zu verwenden, wie mkString:

import scalaz.NonEmptyList, scalaz.syntax.foldable._ 

def formatNel(nel: NonEmptyList[String]): String = nel.toList.mkString("/") 

Die foldable Syntax Import stellt die toList Methode über die Instanz für NonEmptyList bereit. Sie können auch nel.list.toList verwenden, um zuerst in eine scalaz.IList zu konvertieren, aber das ist ein wenig ausführlicher und kann für große Listen weniger effizient sein (von der Spitze meines Kopfes bin ich mir nicht sicher).

Es gibt auch viele andere Möglichkeiten, wie Sie dies direkt schreiben könnten, ohne in eine Scala-Liste zu konvertieren. Man würde zu einem IList zu konvertieren und dann verwenden intersperse und suml:

import scalaz.NonEmptyList, scalaz.std.string._, scalaz.syntax.foldable._ 

def formatNel(nel: NonEmptyList[String]): String = nel.list.intersperse("/").suml 

Für so etwas wie die Formatierung als Zeichenkette, obwohl ich wahrscheinlich zu toList.mkString bleiben würde, da es klar, vertraut und kann mehr sein effizient, da es weniger generisch ist als suml (obwohl das in den meisten Fällen kaum von Bedeutung ist).

+1

Danke, im Grunde habe ich es in meinem Code implementiert, nachdem ich bemerkt habe, dass Show veraltet ist, danach habe ich faltbar importiert und gesehen, dass ich implizit Macht hatte (yeah!), Um es in Liste umzuwandeln (wenn du scala nicht magst) Ihre Muttersprache ist manchmal ein Schmerz in den Arsch mit allen implicits :)), also tat ich das! Ich wollte auf meine Frage antworten, aber ich wollte nicht wie arogant aussehen, also habe ich gewartet, dank dir jetzt weiß ich, dass meine letzte Lösung gut war :) –