Identitätsfunktor über Datensatz zuordnen

8

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?

%Vor%

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.

    
Doug McClean 23.07.2014, 22:51
quelle

1 Antwort

3

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.

    
kosmikus 24.07.2014 06:49
quelle