2010-04-01 10 views
8

.NET Framework 4.0 रिलीज के साथ ISet<T> इंटरफ़ेस जोड़ रहा है। उसी रिलीज में, एफ # को प्रथम श्रेणी की भाषा के रूप में जोड़ा जा रहा है। एफ # एक अपरिवर्तनीय Set<'T> कक्षा प्रदान करता है।एफ # सेट क्यों ISET <T> लागू नहीं करता है?

यह मेरे लिए तार्किक प्रतीत होता है कि प्रदान किया गया अपरिवर्तनीय सेट ISet<T> इंटरफ़ेस को लागू करेगा, लेकिन ऐसा नहीं है। क्या किसी को पता है क्यों?

मेरा अनुमान है कि वे उत्परिवर्तनीय होने के लिए एक इंटरफेस को कार्यान्वित नहीं करना चाहते थे, लेकिन मुझे नहीं लगता कि यह स्पष्टीकरण कायम है। आखिरकार, उनके Map<'Key, 'Value> वर्ग IDictionary लागू करता है, जो उत्परिवर्तनीय है। और इंटरफेस को लागू करने वाले वर्गों के ढांचे में कहीं और उदाहरण हैं जो केवल आंशिक रूप से उपयुक्त हैं।

मेरा दूसरा विचार यह है कि ISet<T> नया है, इसलिए हो सकता है कि वे इसके आसपास न आएं। लेकिन यह पतला लगता है।

क्या तथ्य यह है कि ISet<T> सामान्य है (v। IDictionary, जो नहीं है) इसके साथ कुछ लेना देना है?

इस मामले पर किसी भी विचार की सराहना की जाएगी।

+0

.NET ढांचे में, 'ReadOnlyCollection 'लागू' आईसीओलेक्शन ', जो एक परिवर्तनीय इंटरफ़ेस है। – Steven

+0

@ स्टेवन राइट, यह एक इंटरफ़ेस को लागू करने वाले ढांचे वर्ग का एक उदाहरण है जो पूरी तरह उपयुक्त नहीं है। –

उत्तर

5

ऑफहैंड मुझे नहीं लगता कि I पहले ISet से अवगत था। (असल में मैंने पुराने ईमेल के माध्यम से देखा, और इसके लिए बीसीएल योजनाओं का एक उल्लेख पाया - 2008 से - लेकिन यह था। इसलिए मुझे लगता है कि यह हमारे रडार पर नहीं था।)

उस ने कहा, एफ # स्ट्राव अपने .NET 2.0 और .NET 4.0 बिट्स के बीच स्रोत-संगत होने के लिए, बैक-पोर्टिंग .NET 4.0 इकाइयों को FSharp.Core.dll संस्करण 2.0 में इंगित करें। उदाहरण के लिए, 2.0 FSharp.Core में System.Tuple, System.BigInteger, System.Threading.CancelationTokenSource (एसिंक प्रोग्रामिंग मॉडल का हिस्सा) इत्यादि शामिल हैं, और ISet संभावित रूप से बैक-पोर्ट पर काम करने का एक और काम होगा (यह मेरे लिए अस्पष्ट है अगर यह आवश्यक होगा 'इसे बंद करने के लिए, हालांकि)।

मैं एक नजर रखने के लिए एक मुद्दा दर्ज करूंगा, हालांकि यह समय पर इस बिंदु पर लागू हो सकता है।

+1

यह समझ में आता है। मुझे एहसास नहीं हुआ कि ढांचे में एफ # स्रोत-संगत रखने के लिए एक ड्राइव थी। बस उत्सुक है, लेकिन इसके पीछे तर्क क्या है? क्या आधिकारिक रुख है कि .NET 4.0 में एफ # का "नया" संस्करण नहीं है, बल्कि यह एक आधिकारिक, प्रथम श्रेणी की पैकेजिंग है जो आज मौजूद है? –

5

चूंकि कोई और कूद नहीं रहा है, इसलिए मैं अपनी अटकलें जोड़ूंगा। सबसे पहले, IDictionary<'k,'v> इंटरफ़ेस का बहुमत अभी भी एक अपरिवर्तनीय शब्दकोश के लिए समझ में आता है; यह वास्तव में केवल उन तत्वों को जोड़ या हटा रहा है जो काम नहीं करेंगे। दूसरा, वहां एक सभ्य राशि है जो पहले ही लिखा जा चुका है जो IDictionary पर निर्भर करता है, इसलिए उस कोड के साथ F # मानों का उपयोग करने में सक्षम होना एक अच्छा प्लस है।

दूसरी तरफ, ISet<'t> के तरीकों में से कई विधियों की आवश्यकता होती है, जिसमें न केवल व्यक्तिगत तत्वों को जोड़ना, बल्कि संघ और चौराहे जैसे कई सेट उत्परिवर्तक ऑपरेटरों भी शामिल हैं। इसके अतिरिक्त, IEnumerable<'t> इंटरफेस द्वारा कई सेट उपयोग मामलों को पहले से ही कम किया जा रहा है - मुझे लगता है कि यह अपरिवर्तनीय सेट आधारित कोड के लिए ISet<'t> कार्यान्वयन पर निर्भर रहने के लिए अपेक्षाकृत दुर्लभ होगा।

मुझे नहीं लगता कि जेनेरिकिटी के पास इसके साथ कुछ भी करना है - ध्यान दें कि एमएसडीएन दस्तावेज़ीकरण के बावजूद, एफ # मानचित्र जेनेरिक IDictionary इंटरफेस को लागू करते हैं, गैर-सामान्य नहीं।

+1

यह लगता है कि यह व्यवहार्य है। फिर भी, यह सच होने पर निराशाजनक है।ऐसा लगता है कि उन सभी इंटरफ़ेस विधियों को शामिल करने के लिए मुझे गलती की तरह लगता है जो कार्यान्वयन वर्ग की उत्परिवर्तन को दर्शाता है। (इसी प्रकार, मुझे लगता है कि कक्षा को लागू करने वाली विधियों को शामिल करना एक गलती होगी _immutable_ होना चाहिए।) यह अच्छा होगा अगर 'ISet 'केवल" पढ़ने "सदस्यों को शामिल किया गया हो। मुझे लगता है कि इंटरफेस के रूप में भी बहुत राय है, और अब मैं _still_ वास्तव में संवाद करने का एक तरीका नहीं है कि "यह अद्वितीय वस्तुओं का संग्रह है।" (कम से कम जहां तक ​​एफ # इंटरॉप का संबंध है।) –

+0

काफी बहुमत की तरह दिखता है: मेरी गिनती से, 'आईसेट ' के 11 उचित सदस्यों में से केवल पांच उत्परिवर्तन की आवश्यकता है। यदि आप 'आईसीओलेक्शन ' से वंचित सदस्यों को शामिल करते हैं, तो यह 18 में से आठ हो जाता है (और इनमें से, कम से कम 'शून्य जोड़ें (टी आइटम)' शायद स्पष्ट रूप से लागू किया जाएगा।) –

+0

मैं एक समान उत्तर लिखने के बारे में सोच रहा था, लेकिन तब मैंने 'ISet ' इंटरफ़ेस को देखा और पाया कि इसमें अभी भी कुछ ऑपरेशन हैं जिन्हें अभी भी कार्यान्वित किया जा सकता है (अर्थात् 'सेटक्वाल्स', 'IsSubsetOf',' IsSupersetOf', 'ओवरलैप्स', 'IsProperSubsetOf',' IsProperSupersetOf'), हो सकता है कि यह 'IDictionary' से कम है, लेकिन अभी भी कुछ ... एक और तर्क यह हो सकता है कि कोई .NET विधियां नहीं हैं जो 'ISet ' लेती हैं, इसलिए इसे लागू करने के लिए कोई एप्लिकेशन-संचालित कारण नहीं है (I अनुमान है कि 'IDictionary' के लिए कुछ अच्छा उपयोग मामला हो सकता है)। –

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