Một liên minh phân biệt trong F # được biên dịch thành một lớp trừu tượng và các tùy chọn của nó trở thành các lớp bê tông lồng nhau.F # có nhận thức được các biểu mẫu được biên soạn của các công đoàn bị phân biệt đối xử không?
type DU = A | B
DU là trừu tượng trong khi DU.A và DU.B là bê tông.
Với ServiceStack, việc tuần tự hóa các loại thành chuỗi JSON và ngược lại có thể được tùy chỉnh bằng các hàm. Đối với các loại DU, đây là cách tôi có thể làm điều đó trong 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>
Có phải F # nhận thức về biểu mẫu được biên soạn của các công đoàn bị phân biệt? Làm thế nào tôi có thể nhận được loại DU.A trong F # tại thời gian biên dịch?
typeof<DU> // compiles
typeof<DU.A> // error FS0039: The type 'A' is not defined
typeof<A> // error FS0039: The type 'A' is not defined
Tôi có thể dễ dàng đủ đăng ký chức năng cho quá trình deserialization trong F #.
open System
open ServiceStack.Text
JsConfig<DU>.RawDeserializeFn <-
Func<_, _>(fun s -> printfn "Hooked"; if s = "A" then A else B)
Có thể đăng ký chức năng tuần tự hoàn toàn trong F # cho các loại cụ thể DU.A và DU.B không?
tôi tự hỏi nếu điều này là một phần của F # ngôn ngữ Spec, make này thực hiện F # trong JVM không thể? Bởi vì CLI là một phần của ngôn ngữ bây giờ. –
@WeiMa - Tôi cho rằng thừa kế tương tự có thể được mô hình hóa trên JVM. Đã có một số thảo luận về việc trình biên dịch xuất ra JVM trên danh sách gửi thư, nhưng tôi không nghĩ có bất kỳ kế hoạch nghiêm túc nào. –
@WeiMa: Lưu ý rằng ngôn ngữ F # hỗ trợ các tính năng như kiểu giá trị và các cuộc gọi đuôi mà JVM thậm chí không thể diễn tả. –