F # Core जेनेरिक सरणी प्रकारों को क्यों परिभाषित करता है?


11

मैंने अभी देखा कि FSharp.Core नाम स्थान में 4 आयामों तक के जेनेरिक सरणी प्रकार शामिल हैं, अर्थात कोर। [] <'T> , Core। [,] <' T>, आदि C # और VB बस ठीक काम करते प्रतीत होते हैं। System.Array के साथ - हालांकि यह मेरे लिए स्पष्ट नहीं है कि वे int [], string] जैसे विशेष प्रकार के विशेष प्रकार के प्रकारों का समर्थन करने का प्रबंधन कैसे करते हैं।

मुझे लगता है कि यह दो सवाल बन जाता है:

  • गैर-जेनेरिक सिस्टम के आधार पर C # का दृढ़ता से टाइप किए गए विशेष प्रकार के int [] का समर्थन कैसे करता है?
  • यह देखते हुए कि C # ऐसा करने का प्रबंधन करता है, F # सामान्य सरणी प्रकारों को परिभाषित क्यों करता है?

जवाबों:


8

F # se से सामान्य सरणी प्रकार को परिभाषित नहीं करता है। F # में Arrays एक ही अरै टाइप टाइप हैं। .NET के बाकी उपयोग हैं, और सभी सिंटैक्टिक साक्ष्य इसके विपरीत होने के बावजूद, वे सामान्य हैं।

जब आप F # में प्रतिबिंब का उपयोग कर रहे हैं, तो यह कभी-कभी आप पर उल्टा पड़ सकता है - भले ही आपके पास एक array<int>ऐसा हो जो पूरी तरह से वैध सामान्य प्रकार का प्रतीत होता हो, जब आप इसका निरीक्षण करते हैं तो आपको एक झूठा IsGenericType, एक सच्चा IsArray, और आपको प्रकार तर्क मिलता है GetElementTypeबल्कि तब के साथ GetGenericArguments

टेलस्टाइन ने अपने जवाब में कहा, यह .NET 1.0 का विरासत सामान है, जिसे हमें साथ रहना होगा। लेकिन यह कई चीजों में से एक है जो एफ # एक वास्तविक माइनफील्ड में प्रतिबिंब एपीआई का उपयोग करता है।

F # क्या परिभाषित करता है, [], [,] ...इसी प्रकार के कार्य के साथ संक्षिप्तीकरण / उपनाम / संचालक और मॉड्यूल हैं, लेकिन वे सभी अंत में एक ही एरे प्रकार के लिए संदर्भित करते हैं।

आप यहाँ और यहाँ अपने लिए इसे देखने के लिए यहाँ github पर स्रोत कोड देख सकते हैं।


लेकिन इन्हें वास्तविक प्रकार के रूप में सूचीबद्ध किया गया है, न कि प्रकार के उपनाम। मैं उलझन में हूं क्योंकि msdn.microsoft.com/en-us/library/dd233214.aspx कहता है "सभी F # सरणियों का प्रकार .NET फ्रेमवर्क टाइप एरे" है, लेकिन फिर System.Array और FSharp के बीच क्या संबंध है । सामान्य सामान्य सरणियाँ?
Asik

कोई सामान्य सरणियाँ नहीं हैं;) वे तकनीकी रूप से वास्तविक प्रकार के हो सकते हैं, और यही कारण है कि msdn doc जनरेटर ने उन्हें उठाया, लेकिन यह सब वे परिभाषित करते हैं कि कंपाइलर को उनका विस्तार कैसे करना चाहिए, अगर मैं इसे सही तरीके से पढ़ता हूं (पहली फ़ाइल जो मैंने लिंक की है) , और दूसरी फ़ाइल में कुछ विस्तार के तरीके। यही सब है इसके लिए। उनमें से एक बनाएं और उस पर गेटटाइप को कॉल करें। यह System.Array पर आधारित एक विशेष सरणी प्रकार होगा।
स्क्रबटैप

या बल्कि, स्थैतिक प्रकार स्वयं सामान्य हैं, लेकिन रनटाइम सरणी प्रकार वे लपेट रहे हैं नहीं है। हो सकता है कि टाइप इंफ़ेक्शन लागू करना थोड़ा आसान हो, लेकिन यह एक जंगली अनुमान है।
स्क्रबटैप

5

गैर-जेनेरिक सिस्टम के आधार पर C # का दृढ़ता से टाइप किए गए विशेष प्रकार के int [] का समर्थन कैसे करता है?

बहुत संभव है, System.Arrayजेनेरिक 1.0 में उपलब्ध नहीं थे, क्योंकि एक विशेष वर्ग उत्पन्न करने से । अनुकूलता के लिए व्यवहार को आस-पास रखा गया है।

यह देखते हुए कि C # ऐसा करने का प्रबंधन करता है, F # सामान्य सरणी प्रकारों को परिभाषित क्यों करता है?

क्योंकि F # में समान कॉम्पैटिबिलिटी नहीं थी जो C # 2.0 में मौजूदा कोड के साथ थी। अगर मैं जानता हूं, तो इस आधार पर कि C # 2.0 में सामान्य सरणी प्रकार होते अगर यह C # की पहली रिलीज़ होती।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.