Ist F # die kompilierten Formen seiner diskriminierten Gewerkschaften bekannt?

8

Eine diskriminierte Union in F # wird zu einer abstrakten Klasse kompiliert und ihre Optionen werden zu verschachtelten konkreten Klassen.

%Vor%

DU ist abstrakt, während DU.A und DU.B konkret sind.

Mit ServiceStack kann die Serialisierung von Typen zu JSON-Strings und zurück mit Funktionen angepasst werden. In Bezug auf den DU-Typ, hier ist, wie ich es in C # tun konnte.

%Vor%

Ist F # die von den diskriminierten Gewerkschaften zusammengetragenen Formen bekannt? Wie bekomme ich den Typ von DU.A in F # zur Kompilierzeit?

%Vor%

Ich kann leicht eine Funktion für die Deserialisierung in F # registrieren.

%Vor%

Ist es möglich, Serialisierungsfunktionen für die Betontypen DU.A und DU.B vollständig in F # zu registrieren?

    
philderbeast 24.07.2013, 11:07
quelle

3 Antworten

8

Während das gesamte Verhalten (die abstrakten Klassen usw.) nicht nur ein Implementierungsdetail ist, wird es tatsächlich durch die Spezifikation definiert. Diese Dinge sind nicht von F # aus zugänglich - dies ist ein Zitat aus der Spezifikation.

  

Ein kompilierter Union-Typ U hat:

     

· Eine CLI-statische Getter-Eigenschaft U.C für jeden Null-Union-Fall   C. Diese Eigenschaft ruft ein Singleton-Objekt ab, das jeden solchen darstellt   Fall.

     

· Ein CLI-verschachtelter Typ U.C für jeden Nicht-Null-Vereinigungsfall C. Dies   type hat die Instanzeigenschaften Item1, Item2 .... für jedes Feld der   Vereinigungsfall oder ein Einzelinstanz-Eigenschaft-Element, wenn es nur einen gibt   Feld. Ein kompilierter Union-Typ, der nur einen Fall hat, tut dies jedoch nicht   habe einen verschachtelten Typ. Stattdessen spielt der Unionstyp selbst die Rolle von   der Falltyp.

     

· Eine statische CLI-Methode U.NewC für jeden Nicht-Null-Vereinigungsfall C.   Diese Methode erstellt ein Objekt für diesen Fall.

     

· Eine CLI-Instanzeigenschaft U.IsC für jeden Fall C. Dies   Eigenschaft gibt für den Fall wahr oder falsch zurück.

     

· Eine CLI-Instanzeigenschaft U.Tag für jeden Fall C. Dies   property holt oder berechnet ein Integer-Tag, das dem Case entspricht.

     

· Wenn U mehr als einen Fall hat, hat es einen verschachtelten CLI-Typ   U.Tags. Der Typ U.Tags enthält ein Integer-Literal für jeden Fall in   steigende Reihenfolge beginnend bei Null.

     

· Ein kompilierter Unionstyp verfügt über die Methoden, die erforderlich sind   implementiert seine automatisch generierten Schnittstellen zusätzlich zu allen   benutzerdefinierte Eigenschaften oder Methoden.

     

Diese Methoden und Eigenschaften können nicht direkt aus F # verwendet werden.   Diese Typen haben jedoch benutzerorientierte List.Empty, List.Cons,   Option.None und Option.Some Eigenschaften und / oder Methoden.

Wichtig: "Diese Methoden und Eigenschaften dürfen nicht von F # verwendet werden."

    
John Palmer 24.07.2013, 11:51
quelle
5

Die Tatsache, dass ein DU in F # ein einzelner Typ ist, ist der Schlüssel zu seiner Nützlichkeit. Der F # -Ansatz wäre, Mustervergleich zu verwenden:

%Vor%

Dies sollte funktionieren, weil die Union-Fälle nicht nur verschachtelte Typen in C # sind, sondern auch Subtypen. Wenn ServiceStack Basistyp-Serialisierer nicht berücksichtigt, funktioniert das natürlich nicht.

    
Daniel 24.07.2013 14:16
quelle
4

Daniel hat Recht, Sie können dies tun, indem Sie Serialisierungsfunktionen für den Basistyp DU registrieren. Hier ist ein vollständigeres Beispiel

%Vor%

Ergebnis:

%Vor%     
Leaf Garland 24.07.2013 16:18
quelle