¿F # es consciente de las formas compiladas de sus sindicatos discriminados?

Una unión discriminada en F # se compila en una clase abstracta y sus opciones se convierten en clases concretas anidadas.

type DU = A | B

DU es abstracto, mientras que DU.A y DU.B son concretos.

Con ServiceStack, la serialización de tipos a cadenas JSON y atrás puede personalizarse con funciones. Con respecto al tipo DU, he aquí cómo podría hacerlo en 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 # es consciente de las formas compiladas de sus sindicatos discriminados? ¿Cómo obtendría el tipo de DU.A en F # en tiempo de compilación?

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

Puedo fácilmente registrar una función para la deserialización en F #.

open System
open ServiceStack.Text

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

¿Es posible registrar funciones de serialización completamente en F # para los tipos de concreto DU.A y DU.B?

Respuestas a la pregunta(3)

Su respuesta a la pregunta