F #

2013-04-06 5 views
5

में गणना प्रकारों को विस्तृत करें F # सुविधा से संबंधित एक अन्य प्रश्न "Type extensions" कहा जाता है।F #

एफ # में गणनाओं को विस्तारित करना असंभव प्रतीत होता है। मैं enums देने के लिए C# Extensions Methods एक बहुत का उपयोग करें: सीमा मान्यता तर्क जोड़ने के लिए, विधि है कि स्ट्रिंग प्रतिनिधित्व रिटर्न आदि

दुर्भाग्य से यह आसान enumerations विस्तार करने के लिए केवल भेदभाव संघ लेकिन असंभव का विस्तार संभव लगता है:

1. आंतरिक विस्तार

// CustomEnum.fs 
module CustomEnumModule 

type CustomEnum = 
    | Value1 = 1 
    | Value2 = 2 

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

त्रुटि: "त्रुटि FS0010: अप्रत्याशित प्रतीक '|' सदस्य परिभाषा "

2. वैकल्पिक विस्तार

// CustomEnumEx.fs 
open CustomEnumModule 

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

त्रुटि:" त्रुटि FS0896: Enumerations सदस्य नहीं हो सकते "

यह अजीब मेरे लिए लगता है क्योंकि (1) हम कर सकते हैं पूर्ण-विशेषीकृत भेदभाव वाले संघ के विशेष मामले के रूप में सरल गणनाओं का इलाज करें और हम भेदभाव वाले यूनियनों का विस्तार कर सकते हैं और (2) विस्तारित .NET enums कुछ विशेषताओं को जोड़ने का एक अच्छा तरीका है (inclu डिंग एफपी-फीचर्स) मौजूदा बुनियादी ढांचे के लिए।

क्या यह व्यवहार जानबूझकर है या यह कार्यान्वयन में सरल बग है?

पीएस दुर्भाग्यवश F# Spec इस संबंध में चुप है, या कम से कम मुझे एक या दूसरे व्यवहार के लिए कोई सबूत नहीं मिल रहा है।

+0

पर Hubfs (उर्फ FPish) कुछ समय के लिए एक समान प्रश्न हुई थी: [एक्सटेंशन विधि Enum पर अनुमति नहीं है?] (http://cs.hubfs.net/topic/None/59784) जो बताता है कि यह संभव नहीं है और डिज़ाइन द्वारा –

+0

लिंक के लिए धन्यवाद। और मैं मानता हूं कि यह ** डिजाइन ** द्वारा किया जा सकता है। मैं समझ नहीं पा रहा हूं कि इस फैसले के पीछे तर्क क्या है। –

उत्तर

7

यह एक प्रकार है जो प्रकार का विस्तार करने के लिए इसी तरह की है के रूप में एक ही नाम के साथ एक मॉड्यूल बनाने के लिए संभव है:

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

धन्यवाद, यह एक अच्छा समाधान है। मैं अभी भी सोच रहा हूं, क्यों एफ # देव टीम ने इस सुविधा को enums के लिए लागू नहीं करने का फैसला किया। –

+0

मैं fsbugs-at-microsoft.com और [उपयोगकर्ता Voice] के माध्यम से F # टीम को इस मुद्दे पर प्रतिक्रिया देने की अनुशंसा करता हूं (http://visualstudio.uservoice.com/forums/121579-visual-studio/category/30935- भाषा-एफ-), उन्होंने रिपोर्ट किए गए कई मुद्दों का जवाब दिया है और उन्हें ठीक किया है। –

+0

Thansks, मैं निश्चित रूप से यह करूँगा! –

संबंधित मुद्दे