2010-07-22 10 views
7

मैं रीड-ओनली बंद संग्रह है कि IDictionary < लागू करता है 'कश्मीर,' वी> और IEnumerable < 'वी> बनाना चाहते हैं कैसे बनाएं।एक प्रकार है कि IDictionary <'K, 'V> को लागू करने और IEnumerable <'V>

This type implements or inherits the same interface at different generic instantiations 'IEnumerable<'V>' and 'IEnumerable<KeyValuePair<'K,'V>>'. This is not permitted in this version of F#.

इस को प्राप्त करने का एक अलग तरीका है: स्पष्ट दृष्टिकोण मैं निम्नलिखित त्रुटि मिलती है ले रहा है?

EDIT - चूंकि यह एफ # की एक बड़ी सीमा प्रतीत होता है, यह प्राप्त करने का एक बेवकूफ तरीका क्या होगा? एक विचार जो दिमाग में आता है वह उन सदस्यों को प्रदान कर रहा है जो डेटा के वांछित दृश्य को वापस कर देते हैं, उदाहरण के लिए, सदस्य x.List: IList < 'V> और सदस्य x.Dict: IDictionary <' K, 'V>। ऑब्जेक्ट एक्सप्रेशन का इस्तेमाल कार्यान्वयन प्रदान करने के लिए किया जा सकता है। कोई अन्य विचार?

उत्तर

3

मुझे डर नहीं है। सीएलआर पाठ्यक्रम के कई इंटरफेस (उसी आधार प्रकार के भी) के कार्यान्वयन की अनुमति देता है, लेकिन एफ # भाषा नहीं। मेरा मानना ​​है कि यदि आप सी # में कक्षा लिखते हैं तो आपको कोई समस्या नहीं होगी, लेकिन एफ # आपको मौजूदा संस्करण में समस्याएं देने जा रहा है।

2

जैसा कि नोल्डोरिन कहते हैं, यह संभव नहीं है। एक मूर्खतापूर्ण दृष्टिकोण toSeq और toDict आपके प्रकार के समान नाम वाले मॉड्यूल पर फ़ंक्शन प्रदान करना है (जैसे List.toSeq, Array.toSeq, आदि)।

7

एक अपेक्षाकृत आसान तरीका है कि आप लिख रहे प्रकार के सदस्यों के रूप में दो इंटरफेस के कार्यान्वयन का पर्दाफाश करना चाहते हैं। यह ऑब्जेक्ट एक्सप्रेशन या बस कोड का एक टुकड़ा लिखकर बहुत अच्छी तरह से किया जा सकता है जो कुछ प्रकार का निर्माण करता है और परिणाम के रूप में देता है। दूसरा दृष्टिकोण इस प्रकार दिखाई देगा: एक मॉड्यूल में कार्य के रूप में कार्यान्वयन उजागर

type MyCollection<'K, 'V when 'K : equality>(keys:list<'K>, values:list<'V>) = //' 
    member x.Dictionary = 
    { new IDictionary<'K, 'V> with 
     member d.Add(k, v) = ... }    
    member x.Enumerable = 
    // Similarly for IEnumerable 
    values |> List.toSeq 

:

type MyCollection<'K, 'V when 'K : equality>(keys:list<'K>, values:list<'V>) = //' 
    member x.Dictionary = 
    Seq.zip keys values |> dict 
    member x.Enumerable = 
    values |> List.toSeq 

पहले दृष्टिकोण (यदि आप इंटरफेस के तरीकों को लागू करना चाहते हैं सीधे इस तरह मोटे तौर पर विचार करेंगे जैसा कि केवीबी द्वारा उल्लिखित किया गया है, यह भी एक अच्छा विकल्प है - मुझे लगता है कि मानक एफ # लाइब्रेरी प्रकारों में से कई वास्तव में दोनों विकल्प करते हैं (ताकि उपयोगकर्ता उस शैली को चुन सकें जिसे वह पसंद करता है)। इसे इस तरह जोड़ा जा सकता है:

module MyCollection = 
    let toDict (a:MyCollection<_, _>) = a.Dictionary 
संबंधित मुद्दे