2015-09-16 5 views
6

यह मेरे लिए अभी हुआ, कि एफ # जेनेरिक स्थिर मानों को "टेम्पलेट पैरामीटर" के रूप में स्वीकार नहीं करते हैं।निरंतर "टेम्पलेट तर्क" के साथ कोई एफ # जेनरिक नहीं?

मान लीजिए कि कोई RangedInt टाइप करना चाहता था, तो यह एक int की तरह व्यवहार करता है लेकिन केवल पूर्णांक मानों की उप-श्रेणी को ही गारंटी देता है।

एक संभावित दृष्टिकोण एक साथ भेदभाव संघ, के समान हो सकता है:

type RangedInt = | Valid of int | Invalid 

लेकिन यह या तो काम नहीं कर रहा, के रूप में वहाँ कोई "प्रकार रेंज जानकारी के विशिष्ट भंडारण" है। और रेंज अलग होने पर 2 रेंज किए गए उदाहरण अलग-अलग प्रकार के होने चाहिए।

होने के नाते अभी भी एक सा सी ++ पीड़ित इसे करने के लिए समान दिखेगा:

template<int low,int high> 
class RangedInteger { ... }; 

अब सवाल है, उत्पन्न होने वाली है दो गुना:

  1. क्या मैं मौजूद एफ # जेनरिक के लिए कुछ और निरंतर मूल्यों को याद?
  2. यदि मुझे यह याद नहीं आया, तो F # में ऐसे RangedInt<int,int> को पूरा करने का बेवकूफ तरीका क्या होगा?

Tomas Petricek's blog about custom numeric types पाया करने के बाद, कि ब्लॉग लेख के लिए मेरे सवाल के बराबर होगा: क्या होगा यदि वह एक IntegerZ5 लेकिन एक IntegerZn<int> कस्टम प्रकार परिवार नहीं किया?

उत्तर

7

जिस भाषा सुविधा का आप अनुरोध कर रहे हैं उसे Dependent Types कहा जाता है, और F # में यह सुविधा नहीं है।

यह विशेष रूप से आम भाषा सुविधा नहीं है, और यहां तक ​​कि हास्केल (जो कि अन्य कार्यात्मक प्रोग्रामिंग भाषाएं 'देखने के लिए') वास्तव में नहीं है।

वहां भाषाएं हैं जो निर्भर प्रकार के साथ हैं, लेकिन उनमें से कोई भी मुख्यधारा पर विचार नहीं करेगा। शायद मैं सबसे ज्यादा सुनाई देता हूं Idris है।

+0

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

1

क्या मुझे कुछ याद आती है और एफ # जेनेरिक के लिए निरंतर मूल्य मौजूद हैं?

जबकि एफ # में अन्य .NET भाषाओं की तुलना में बहुत मजबूत प्रकार अनुमान है, इसके दिल में यह .NET पर बनाया गया है।

और .NET जेनेरिक केवल सी ++ टेम्पलेट्स के साथ संभव है कि एक छोटे से सबसेट का समर्थन करते हैं। जेनेरिक प्रकारों के लिए सभी प्रकार के तर्क प्रकार होना चाहिए, और टाइप तर्कों की कोई डिफ़ॉल्टता नहीं है।

यदि मुझे यह याद नहीं आया, तो F # में इस तरह के RangedInt को पूरा करने का बेवकूफ तरीका क्या होगा?

यह विवरणों पर निर्भर करेगा। रनटाइम पर सीमा निर्धारित करना एक संभावना है - यह .NET में सामान्य दृष्टिकोण होगा। एक और माप की इकाइयां होगी (ऐसा लगता है कि यह फिट होने की संभावना कम है)।

क्या होगा अगर वह एक IntegerZ5 लेकिन एक IntegerZn<int> कस्टम प्रकार परिवार नहीं किया?

मैं दो कारणों से देखें:

  • यह एक उदाहरण है, और जेनरिक परहेज उदाहरण के बिंदु पर बातें सरल फोकस की इजाजत दी रहता है।
  • वैसे भी अन्य अंतर्निहित प्रकार क्या उपयोग करेगा? समकालीन प्रणालियों पर छोटे प्रकार (byte, Int16 इत्यादि।) कम कुशल हैं (जब तक रनटाइम पर जगह भारी चिंता नहीं होती है); long लाभ के बिना आकार जोड़ देगा (यह केवल 5 संभावित मानों को पकड़ने जा रहा है)।
+0

हां, और जेनेरिक से दूर रखने से लेख को मेरे प्रश्न में समस्या से दूर रखा गया है :) दूसरे शब्दों में, 'IntegerZn ' '' IntegerZn <5> '' के अर्थ में नहीं था, "किस प्रकार का उपयोग करने के लिए" प्रकार का अर्थ। – BitTickler

+0

और रनटाइम पर मान सेट करना एक विकल्प नहीं है जैसा कि मैं प्राप्त करने का प्रयास करता हूं, टाइप सिस्टम सिस्टम को संकलित समय पर बग पकड़ना है। यदि यह श्रेणी सेटिंग्स के साथ 1 प्रकार था, तो यह अभी भी 1 प्रकार होगा। – BitTickler

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