Czy F # jest świadomy skompilowanych formularzy dyskryminowanych związków?

Dyskryminowane połączenie w F # jest kompilowane do klasy abstrakcyjnej, a jej opcje stają się zagnieżdżonymi klasami betonowymi.

type DU = A | B

DU jest abstrakcyjny, podczas gdy DU.A i DU.B są konkretne.

Dzięki ServiceStack serializacja typów na łańcuchy JSON i wstecz może być dostosowana za pomocą funkcji. Jeśli chodzi o typ DU, oto jak mogę to zrobić w 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>

Czy F # jest świadomy skompilowanych formularzy dyskryminowanych związków? Jak uzyskać typ DU.A w F # w czasie kompilacji?

typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined

Mogę łatwo zarejestrować funkcję do deserializacji w F #.

open System
open ServiceStack.Text

JsConfig<DU>.RawDeserializeFn <-
    Func<_, _>(fun s -> printfn "Hooked"; if s = "A" then A else B)

Czy jest możliwe zarejestrowanie funkcji serializacji całkowicie w F # dla konkretnych typów DU.A i DU.B?

questionAnswers(3)

yourAnswerToTheQuestion