Frage

Ich bin ein relativer Skala -Anfänger und möchte Ratschläge zum Vorgehen einer Implementierung, die so aussieht, dass sie entweder mit einer Funktionsrendite oder mit Teilfunktionen erfolgen kann. Ich habe alle zugehörigen Beiträge gelesen, die ich finden konnte (siehe unten in Frage), aber diese scheinen die technischen Details der Verwendung von Teilfunktion oder zur Konvertierung auf den anderen zu beinhalten. Ich suche nach einer Antwort auf den Typ "Wenn die Umstände x, y, z sind, dann verwenden Sie a sonst B, aber auch C in Betracht".

Mein Beispiel -Anwendungsfall ist eine Pfadsuche zwischen Standorten mit einer Bibliothek von Pfadfinder. Sagen Sie, die Standorte sind vom Typ L, ein Weg war vom Typ P und das gewünschte Pfad -Suchergebnis wäre ein Iterable[P]. Das Patch -Suchergebnis sollte zusammengebaut werden, indem alle Pfadfinder (in so etwas wie Google Maps gefragt werden können. Endpaar.

Es scheinen zwei Möglichkeiten zu geben:

(a) Definieren Sie einen Pfadfinder als f: (L,L) => Option[P] und dann das Ergebnis über so etwas wie finders.map( _.apply(l1,l2) ).filter( _.isDefined ).map( _.get )

(b) Definieren Sie einen Pfadfinder als f: PartialFunction[(L,L),P] and then get the result via something likefinders.filter (_.isdefined ((l1, l2)) .MAP (_.Apply ((l1, l2))) `

Es scheint, als würde eine Funktion zurückkehren Option[P] würde eine doppelte Bewertung der Ergebnisse vermeiden, daher kann dies für eine teure Berechnung vorzuziehen sein, wenn man die Ergebnisse zwischengespeichert. Es scheint auch zu verwenden Option Man kann eine willkürliche Eingangssignatur haben, während man während PartialFunction erwartet ein einziges Argument. Aber ich bin besonders daran interessiert, von jemandem mit praktischen Erfahrungen mit weniger unmittelbaren, mehr "größeren Bild" zu hören, wie beispielsweise die Interaktion mit der Scala -Bibliothek. Würde a PartialFunction Haben Sie erhebliche Vorteile, um bestimmte Methoden der Sammlungs -API zur Verfügung zu stellen, die sich auf andere Weise auszahlen könnten? Wäre ein solcher Code im Allgemeinen prägnanter?

Verwandte, aber unterschiedliche Fragen:

War es hilfreich?

Lösung

Es fühlt sich an wie Option könnte besser zu Ihrem Anwendungsfall passen.

Meine Interpretation ist, dass Teilfunktionen gut funktionieren, um über Eingabebereiche zu kombinieren. Also wenn f ist überdacht (SanDiego,Irvine) und g ist überdacht (Paris,London) Dann können Sie eine Funktion erhalten, die über der kombinierten Eingabe definiert ist (SanDiego,Irvine) und (Paris,London) durch f orElse g.

Aber in Ihrem Fall scheint es für eine bestimmte Dinge zu sehen (l1,l2) Ort Tupel und dann arbeiten Sie etwas ...

Wenn Sie viel schreiben, schreiben Sie viel {case (L,M) => ... case (P,Q) => ...} Dann kann es das Zeichen sein, dass Teilfunktionen besser passen.

Andernfalls funktionieren die Optionen gut mit dem Rest der Sammlungen und können so anstelle Ihres (a) Vorschlags verwendet werden:

val processedPaths = for {
  f <- finders
  p <- f(l1, l2)
} yield process(p)

Innerhalb des Verständnisses p wird in eine angehoben Traversable, Sie müssen also nicht einmal anrufen filter, isDefined oder get um die Finder ohne Ergebnisse zu überspringen.

Andere Tipps

Es ist nicht so bekannt, aber da 2,8 Scala eine hat collect Methode definiert auf seinen Sammlungen. collect ist ähnlich wie filter, nimmt aber eine teilweise Funktion und hat die Semantik, die Sie beschreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top