2013-04-06 4 views
5

Eine weitere Frage im Zusammenhang mit F # Feature namens "Type extensions".Erweitern Aufzählungsarten in F #

Es scheint unmöglich, Aufzählungen in F # zu erweitern. Ich benutze C# Extensions Methods viel für Aufzählungen erstreckt: Bereich Validierungslogik hinzufügen, Methode, die String-Darstellung zurück usw.

Leider scheint es möglich, nur diskriminiert Union zu erweitern, sondern unmöglich einfache Aufzählungen zu verlängern:

1. Intrinsic Erweiterung

// CustomEnum.fs 
module CustomEnumModule 

type CustomEnum = 
    | Value1 = 1 
    | Value2 = 2 

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

Fehler: „Fehler FS0010: Unerwarteter Symbol '|' in Mitglied Definition“

2. Optionale Erweiterung

// CustomEnumEx.fs 
open CustomEnumModule 

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

Fehler: "Fehler FS0896: Aufzählungen können nicht Mitglieder haben"

Es scheint für mich komisch, weil (1) können wir behandeln einfache Aufzählungen als Sonderfall der diskriminierten Union mit vollem Funktionsumfang und wir können diskriminierten Gewerkschaften erweitern und (2) erweitern. NET enums ist ein guter Weg, um einige Funktionen hinzuzufügen (inclu ding FP-Features) in die bestehende Infrastruktur.

Ist dieses Verhalten beabsichtigt oder ist dies ein einfacher Fehler in der Implementierung?

P.S. Leider schweigt F# Spec in dieser Hinsicht, oder zumindest kann ich dort keine Beweise für das eine oder andere Verhalten finden.

+0

Es gibt eine ähnliche Frage auf Hubfs war (aka FPish) eine Weile zurück: [Erweiterungsmethode auf Enum nicht erlaubt?] (http://cs.hubfs.net/topic/None/59784) was darauf hindeutet, dass es nicht möglich ist und von Entwurf ist –

+0

Danke für den Link. Und ich stimme zu, dass das ** von Entwurf sein könnte **. Ich kann nicht verstehen, was die Gründe für diese Entscheidung sind. –

Antwort

7

Es ist möglich, ein Modul mit dem gleichen Namen wie eine Art zu schaffen, die die Verlängerung der Art ähnlich ist:

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

Danke, das ist eine gute Lösung. Ich frage mich immer noch, warum das F # dev-Team beschlossen hat, diese Funktion nicht für Enums zu implementieren. –

+0

Ich würde empfehlen, dem F # -Team über fsbugs-at-microsoft.com und [User Voice] (http://visualstudio.uservoice.com/forums/121579-visual-studio/category/30935-) Feedback zu dem Problem zu geben. Sprachen-f-), haben sie auf viele der von mir berichteten Probleme reagiert und diese behoben. –

+0

Thansks, ich werde das definitiv tun! –