Ich habe den folgenden Anwendungsfall, der häufig in meinem Code vorkommt:
und ich möchte eine Sammlung von B erhalten. Ich kann implizit wie folgt verwenden:
%Vor%Was ist der eleganteste Weg, das in Scala zu tun, vielleicht mit Hilfe von Scalaz, das Gleiche zu tun?
Bearbeiten: Das Ziel meiner Frage ist es, einen idiomatischen Weg zu finden, einen gemeinsamen Ansatz zwischen Bibliotheken / Entwicklern. In einem solchen Sinn ist die Entwicklung meiner eigenen pimp-my-Bibliothek-Lösung etwas, was ich nicht mag, weil andere Leute, die meinen Code schreiben, die Existenz dieser Konvertierung nicht kennen und sie nicht verwenden würden, und sie werden ihre eigenen umschreiben. Ich bevorzuge einen Bibliotheksansatz für diese gemeinsamen Funktionen und deshalb frage ich mich, ob es in Scalaz ein solches Feature gibt.
Es ist ziemlich einfach, wenn Sie die Typen kennen. Erste implizite Konvertierung von A
nach B
:
Dann benötigen Sie eine implizite Konvertierung von List[S]
nach List[T]
, wobei S
und T
beliebige Typen sind, für die eine implizite Konvertierung von S
nach T
existiert:
Das sollte dann funktionieren:
%Vor%wird vom Compiler aufgelöst nach:
%Vor% wobei S
ist A
und T
ist B
.
Ich würde hier keine implizite Konvertierung verwenden, sondern eine in der Klasse gebundene Ansicht:
%Vor% Sie können nun eine Instanz von Items
mit einer Liste von Foo
erstellen und sie intern verwenden, als wären sie Bar
s.
Bearbeiten :
Eine Erläuterung, warum ich keine implizite Konvertierung verwenden würde:
Implizite Conversions können gefährlich sein, wenn sie im Geltungsbereich sind und versehentlich Dinge konvertieren, die sie nicht konvertieren sollten. Ich würde das Zeug immer explizit oder über Ansichtsgrenzen konvertieren, weil ich es dann kontrollieren kann. Auch die implizite Konvertierung kann die Größe Ihres Codes verringern, macht es aber für andere auch schwieriger zu verstehen. Ich würde nur implizite Konvertierung für das 'erweitern meine Bibliothek' Muster verwenden.
edit2 :
Sie können jedoch den Sammlungsarten eine Methode hinzufügen, die diese Konvertierung durchführt, wenn eine solche Methode im Geltungsbereich ist:
%Vor%Anstatt hier eine andere implizite Umwandlung zu verwenden, würde ich wahrscheinlich stattdessen eine Typenklasse verwenden, aber ich denke, Sie bekommen die Grundidee.
In meinem Code verwende ich eine allgemeinere Version, die von Tomasz 'Lösung, die alle Traversable
Instanzen behandelt, angepasst wurde
%Vor%
(Das funktioniert für mich, obwohl ich gerne wissen möchte, ob erfahrene Scala-Programmierer das aus irgendwelchen Gründen für eine schlechte Idee halten, abgesehen von den üblichen Vorbehalten gegenüber impliziten Konvertierungen)