Ich habe einen Datensatztyp wie diesen:
%Vor% Das ist cool, weil ich ein VehicleState Signal
haben kann, wo ich alle Arten von Metadaten habe, ich kann ein VehicleState (Wire s e m ())
haben, wo ich die netwire
Semantik jedes Signals habe, oder ich kann ein VehicleState Identity
haben wo ich tatsächliche Werte zu einer bestimmten Zeit beobachtet habe.
Gibt es eine gute Möglichkeit, zwischen VehicleState Identity
und VehicleState'
, definiert durch Zuordnung von runIdentity
über jedes Feld, hin und her zu mappen?
Offensichtlich ist es trivial, einen zu schreiben, aber ich habe tatsächlich mehrere Typen in meiner realen Anwendung und füge Felder hinzu oder entferne sie, so dass es langweilig ist.
Ich schreibe ein Template Haskell, das es tut, frage mich nur, ob ich das Rad neu erfinde.
Wenn Sie keine Typfamilien ablehnen und nicht zu viele Tippfehler benötigen, können Sie tatsächlich einen einzigen Datentyp verwenden:
%Vor% Die Apply
type-Familie ist im Singletons -Paket definiert. Es kann angewendet werden auf
verschiedene Typen von Funktionen, die ebenfalls in diesem Paket definiert sind (und natürlich können Sie Ihre
besitzen). % Co_de% hat die Eigenschaft, dass IdSym0
auf plain Apply IdSym0 x
reduziert wird. Und
x
hat die Eigenschaft, dass TyCon1
auf Apply (TyCon1 f) x
reduziert wird.
Wie von
f x
und test1
, dies erlaubt beide Versionen Ihres Datentyps. Aber du brauchst es
Geben Sie jetzt Anmerkungen für die meisten Datensätze ein.
Tags und Links haskell template-haskell functor