2011-08-17 14 views
10

निम्न कोड संकलित नहीं करता है।वैकल्पिक तर्कों का प्रचार

type A(?arg) = 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) //ERROR expected type string but has type 'a option 

मुझे लगता है इस वजह से विकल्प की अंतर्निहित प्रकार का एक उदाहरण प्रदान किया जाना चाहिए, और संकलक Some/None गुजर हैंडल वाक्य रचना पर आधारित है।

मेरी धारणा को मानते हुए सही ढंग से माना गया है, क्या इसके लिए कोई कामकाज है? क्या वैकल्पिक तर्कों का प्रचार करना संभव है?

उत्तर

21

एफ # कल्पना 8.13.5 वैकल्पिक विधि के सदस्यों को तर्क

कॉलर्स निम्नलिखित तकनीकों का उपयोग करके वैकल्पिक तर्क के लिए मान निर्दिष्ट कर सकते हैं:

  • नाम से , जैसे arg2 = 1.
  • नाम से मौजूदा वैकल्पिक मान का प्रचार करके, जैसे कि arg2 = none या? arg2 = कुछ (3) या? arg2 = arg2। यह उपयोगी हो सकता है जब एक विधि का निर्माण जो वैकल्पिक तर्कों को दूसरे पर पास करता है।
  • स्थिति से मेल खाने वाले सामान्य, अज्ञात तर्कों का उपयोग करके।

    type A(?arg) = 
        member __.Arg : string option = arg 
    
    type B(?arg) = 
        inherit A(?arg = arg) 
    
    printfn "1. %A" (B()).Arg // None 
    printfn "2. %A" (B("1")).Arg // Some "1" 
    
    printfn "3. %A" (A()).Arg // None 
    printfn "4. %A" (A("1")).Arg // Some "1" 
    
+0

ठीक है। आपने कल्पना का बहुत अधिक तरीका पढ़ा है। :-) यह क्यों काम करता है? – Daniel

+0

कभी नहीं। मैंने इसे spec में पाया। मैंने इसे कुछ समय पढ़ा है। – Daniel

+0

धन्यवाद ... कभी-कभी सिंटैक्स बस आसान है;) – Carsten

1

क्षमा करें इसे पहले परीक्षण करना था: ऐसा लगता है कि आप सही हैं - आपको "?" करना है एक खुद के लिए:

type A(arg : string option) = 
    new (a) = new A(Some a) 
    new() = new A(None) 
    member __.Arg : string option = arg 

type B(?arg) = 
    inherit A(arg) 
+0

कि व्यावहारिक है। धन्यवाद। मैं इंतजार करूंगा और देख सकता हूं कि कोई भी सुझाव दे सकता है कि 'ए' पर वैकल्पिक तर्कों को बनाए रखते हुए यह कैसे काम करे। – Daniel

+0

दूसरे विचार पर, इसका मतलब है वैकल्पिक तर्कों का प्रचार नहीं किया जा सकता है। आपके पास एक वैकल्पिक विधि के साथ एक विधि या व्युत्पन्न कक्षा नहीं हो सकती है जो कि कन्स्ट्रक्टर को पास किया जा रहा है - थोड़े सीमित। इसे हर बार सही कन्स्ट्रक्टर अधिभार के लिए ब्रांचिंग की आवश्यकता होगी। – Daniel

+0

एक बग हो सकता है - प्रकार के अंदर तर्क (के साथ?) स्ट्रिंग विकल्प है, लेकिन नई स्ट्रिंग की परिभाषा में - शायद हमें एक केस दर्ज करना चाहिए? – Carsten

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