2013-04-06 36 views
5

Một câu hỏi khác liên quan đến tính năng F # được gọi là "Type extensions".Mở rộng các kiểu liệt kê trong F #

Dường như không thể mở rộng liệt kê trong F #. Tôi sử dụng C# Extensions Methods rất nhiều cho việc mở rộng enums: thêm logic xác nhận phạm vi, phương thức trả về chuỗi đại diện, vv

Đáng tiếc là có vẻ như có thể mở rộng liên minh chỉ bị kỳ thị nhưng không thể mở rộng enumerations đơn giản:

1. Intrinsic mở rộng

// CustomEnum.fs 
module CustomEnumModule 

type CustomEnum = 
    | Value1 = 1 
    | Value2 = 2 

// Trying to split definition of the enum 
type CustomEnum with 
    | Value3 = 3 

lỗi: "lỗi FS0010: biểu tượng bất ngờ '|' trong định nghĩa thành viên"

2. mở rộng Tùy chọn

// CustomEnumEx.fs 
open CustomEnumModule 

type CustomEnum with 
    member public x.PrintValue() = 
     printfn "%A" x 

Lỗi: "lỗi FS0896: Enumerations không thể có các thành viên"

Nó có vẻ lạ đối với tôi bởi vì (1) chúng ta có thể coi các liệt kê đơn giản là trường hợp đặc biệt của nghiệp đoàn phân biệt đầy đủ tính năng và chúng tôi có thể mở rộng các công đoàn bị phân biệt đối xử và (2) mở rộng .NET enums là một cách hay để thêm một số tính năng (inclu ding tính năng FP) cho cơ sở hạ tầng hiện có.

Hành vi này có chủ ý hay đây là lỗi đơn giản khi triển khai?

P.S. Thật không may F# Spec là im lặng trong vấn đề này, hoặc ít nhất tôi không thể tìm thấy bất kỳ bằng chứng cho một hoặc hành vi khác ở đó.

+0

Có một câu hỏi tương tự trên Hubfs (aka FPish) một khi trở lại: [phương pháp mở rộng trên Enum không được phép?] (http://cs.hubfs.net/topic/None/59784) cho thấy rằng nó là không thể và được thiết kế –

+0

Cảm ơn bạn đã liên kết. Và tôi đồng ý rằng điều này ** có thể là do thiết kế **. Tôi không thể hiểu được lý do đằng sau quyết định này. –

Trả lời

7

Có thể để tạo ra một mô-đun với tên giống như một loại tương tự như mở rộng các loại hình:

type CustomEnum = Value1 = 1 | Value2 = 2 

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>] 
module CustomEnum = 
    let Print = function 
    | CustomEnum.Value1 -> "One" 
    | CustomEnum.Value2 -> "Two" 
    | _ -> invalidArg "" "" 

let value = CustomEnum.Value1 

let s = CustomEnum.Print value 
+0

Cảm ơn, đây là một giải pháp tốt. Tôi vẫn tự hỏi, tại sao nhóm F # dev quyết định không triển khai tính năng này cho enums. –

+0

Tôi khuyên bạn nên đưa ra phản hồi về vấn đề cho nhóm F # qua fsbugs-at-microsoft.com và [User Voice] (http://visualstudio.uservoice.com/forums/121579-visual-studio/category/30935- ngôn ngữ-f-), họ đã phản hồi và khắc phục nhiều vấn đề tôi đã báo cáo. –

+0

Thansks, tôi chắc chắn sẽ làm điều này! –

Các vấn đề liên quan