F # está ciente das formas compiladas de seus sindicatos discriminados?

Uma união discriminada em F # é compilada para uma classe abstrata e suas opções tornam-se classes concretas aninhadas.

type DU = A | B

O DU é abstrato, enquanto o DU.A e o DU.B são concretos.

Com o ServiceStack, a serialização de tipos para strings JSON e de volta pode ser personalizada com funções. Com relação ao tipo DU, aqui está como eu poderia fazer isso em 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 # está ciente das formas compiladas de seus sindicatos discriminados? Como eu poderia obter o tipo de DU.A em F # em tempo de compilação?

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

Eu posso facilmente registrar uma função para desserialização em F #.

open System
open ServiceStack.Text

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

É possível registrar funções de serialização inteiramente em F # para os tipos de concreto DU.A e DU.B?