Un'unione discriminato in F # viene compilato in una classe astratta e le sue opzioni diventano classi concrete nidificate.F # è a conoscenza dei moduli compilati dai sindacati discriminati?
type DU = A | B
DU è astratta, mentre DU.A e DU.B sono concrete.
Con ServiceStack, la serializzazione di tipi di stringhe e indietro JSON possono essere personalizzati con le funzioni. Per quanto riguarda il tipo di DU, ecco come ho potuto farlo in C#.
using ServiceStack.Text;
JsConfig<DU.A>.SerializeFn = v => "A"; // Func<DU.A, String>
JsConfig<DU.B>.SerializeFn = v => "B"; // Func<DU.B, String>
JsConfig<DU>.DeserializeFn = s =>
if s == "A" then DU.NewA() else DU.NewB(); // Func<String, DU>
F # è a conoscenza delle forme compilate dai sindacati discriminati? Come potrei ottenere il tipo di DU.A in F # in fase di compilazione?
typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined
Posso facilmente registrare una funzione per la deserializzazione in F #.
open System
open ServiceStack.Text
JsConfig<DU>.RawDeserializeFn <-
Func<_, _>(fun s -> printfn "Hooked"; if s = "A" then A else B)
E 'possibile registrarsi serializzare funzioni totalmente in F # per i tipi concreti DU.A e DU.B?
Mi chiedo se questo è parte di F # lingua Spec, fa questo make attuazione F # in JVM impossibile? Perché CLI è parte del linguaggio ora. –
@WeiMa - Suppongo che un'eredità simile possa essere modellata sulla JVM. Ci sono state alcune discussioni su come far compilare il compilatore alla JVM sulla mailing list, ma non penso ci siano piani seri. –
@WeiMa: si noti che il linguaggio F # supporta funzioni come i tipi di valore e le chiamate di coda che la JVM non può nemmeno esprimere. –