F# 中的可区分联合被编译为抽象类,其选项成为嵌套的具体类。
type DU = A | B
DU 是抽象的,而 DU.A 和 DU.B 是具体的。
使用 ServiceStack,可以使用函数自定义类型到 JSON 字符串和返回的序列化。关于 DU 类型,以下是我在 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# 是否知道它的可区分联合的编译形式?如何在编译时获得 F# 中的 DU.A 类型?
typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined
我可以很容易地在 F# 中注册一个反序列化函数。
open System
open ServiceStack.Text
JsConfig<DU>.RawDeserializeFn <-
Func<_, _>(fun s -> printfn "Hooked"; if s = "A" then A else B)
是否可以在 F# 中为具体类型 DU.A 和 DU.B 完全注册序列化函数?