2013-04-06 4 views
5

Kolejne pytanie związane z funkcją F # o nazwie "Type extensions".Rozszerz typy wyliczeń w F #

Wydaje się niemożliwe, aby rozszerzyć wyliczenia w F #. Używam C# Extensions Methods dużo rozszerzenia teksty stałe: dodać logiki sprawdzania zakres, metody, która zwraca ciąg znaków reprezentujący itp

Niestety wydaje się możliwe przedłużenia tylko dyskryminowanych Unii, ale niemożliwe przedłużyć prostych wyliczeń:

1. Wewnętrzna rozszerzenie

// CustomEnum.fs 
module CustomEnumModule 

type CustomEnum = 
    | Value1 = 1 
    | Value2 = 2 

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

błędu: „błąd FS0010: Nieoczekiwany symbol '|' w definicji Member”

2. Opcjonalne rozszerzenie

// CustomEnumEx.fs 
open CustomEnumModule 

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

błędu: "Błąd FS0896: Wyliczenia nie może mieć członków"

Wydaje się dziwne dla mnie, ponieważ (1) możemy traktuj proste wyliczenia jako specjalny przypadek w pełni funkcjonującej dyskryminowanej unii i możemy może rozszerzyć dyskryminowane związki i (2) rozszerzające .NET wyliczenia to dobry sposób na dodanie niektórych funkcji (w tym ding FP-features) do istniejącej infrastruktury.

Czy to zachowanie jest zamierzone, czy jest to prosty błąd w implementacji?

P.S. Niestety F# Spec milczy w tym względzie, a przynajmniej nie mogę znaleźć żadnych dowodów na to czy tamto zachowanie.

+0

była podobna pytanie o Hubfs (vel FPish) A, podczas gdy tylna [Wydłużanie na Enum nie jest dozwolone?] (http://cs.hubfs.net/topic/None/59784) co sugeruje, że nie jest to możliwe i jest zgodne z projektem –

+0

Dzięki za link. Zgadzam się, że to ** może być zgodne z projektem **. Nie rozumiem, jakie są powody tej decyzji. –

Odpowiedz

7

możliwe jest utworzenie modułu o tej samej nazwie, rodzaju, który jest podobny do przedłużenia typu:

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

Dzięki, to jest dobre rozwiązanie. Nadal zastanawiam się, dlaczego zespół F # dev postanowił nie implementować tej funkcji do wyliczenia. –

+0

Polecam przekazywanie opinii na temat problemu zespołowi F # za pośrednictwem fsbugs-at-microsoft.com i [User Voice] (http://visualstudio.uservoice.com/forums/121579-visual-studio/category/30935- języki-f-), odpowiedzieli i naprawili wiele problemów, które zgłosiłem. –

+0

Thansks, zdecydowanie to zrobię! –