प्रोग्रामिंग भाषाएं रिटर्न प्रकार के संबंध में विधि हस्ताक्षर क्यों उत्पन्न करती हैं?


11

मैंने कई भाषाओं के साथ काम किया है जो रिटर्न प्रकार के आधार पर विधि हस्ताक्षर उत्पन्न नहीं करते हैं। मैंने भी एक (शायद कुछ?) के साथ काम किया है। जिन लोगों ने मुझे अतीत में समस्याएं नहीं दी हैं (जैसे यहां )। प्रोग्रामिंग भाषाएं रिटर्न प्रकार के संबंध में विधि हस्ताक्षर क्यों उत्पन्न करती हैं?

अद्यतन: मैं विशेष रूप से संकलित भाषाओं को संकलित करने की बात कर रहा हूं


यह एक बहुत ही निराधार अनुमान है, लेकिन मैं यह अनुमान लगा रहा हूं कि इसे कंपाइलर कार्यान्वयन और / या उपकरण समर्थन की कठिनाई के साथ कुछ करना है।
चार्ल्स लैम्बर्ट

हास्केल में आप मूल रूप से फ़ंक्शंस टाइप करने के लिए टाइपकास्टेस का उपयोग कर सकते हैं जो कि निर्भर प्रकार हैं। I <3 हास्केल: D: D: D
थॉमस ईडिंग

जवाबों:


5

यह टाइपकास्टिंग और प्रकार की पदानुक्रम के साथ अच्छी तरह से जाल नहीं होगा। यदि आपके पास एक विधि के दो संस्करण हैं, जिनमें से एक प्रकार ए और एक जो टाइप बी लौटाता है, आप मुसीबत में आते हैं:

  • A या B एक-दूसरे के उप-प्रकार हैं, और आप उस मान को लौटाते हैं, जो सुपरपाइप है।
  • A और B का एक सामान्य सुपरपाइप है, और आप इस तरह के सुपरपाइप वैल्यू को असाइन करते हैं।

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


1
मैंने उन भाषाओं के साथ काम किया है जिनमें हस्ताक्षर में रिटर्न प्रकार शामिल है। जैसा कि आप इंगित करते हैं, सभी जगह कास्टिंग करना कोई समस्या नहीं है। अपने विशिष्ट उदाहरण में आपको कलाकारों के साथ इसके आस-पास जाने की आवश्यकता नहीं होगी। यदि A और B (C के सबटाइप्स) दोनों का एक ही ऑपरेशन होता है, तो इसे C. में घोषित किया जाना चाहिए। यदि A के लिए A के लिए रिटर्न टाइप अलग है: ज्यादातर मामलों में यह C का सबटाइप वापस करने की कोशिश कर रहा है। आप बस उपप्रकार में एक और विधि जोड़ें जो उपप्रकार लौटाता है और विशिष्ट उपप्रकार के साथ कॉल करने के लिए C से संस्करण को लागू करता है। अब आपको सभी जगह नहीं डालना है।
चार्ल्स लैम्बर्ट

@Charles Lambert: यह A, B, या C. कक्षाओं पर एक ऑपरेशन नहीं है। यह एक ही नाम और पैरामीटर सूची के साथ दो कार्य हैं, जिनमें से एक प्रकार A का कुछ देता है और दूसरा जो कुछ प्रकार B का रिटर्न देता है। यह प्रश्न लागू होता है। केवल OOP प्रणालियों से अधिक, इसलिए मैंने सामान्य प्रकारों और कार्यों के आधार पर उत्तर दिया। इसके अलावा, मुझे समझ नहीं आ रहा है कि आपके खंडन के उदाहरण को पूरा करने का इरादा क्या है; मुझे इसका जवाब देने के लिए और अधिक विस्तार की आवश्यकता है।
jprete

एक उदाहरण के लिए एक टिप्पणी बहुत छोटी है। pastebin.com/JR39PKs0 मूल रूप से हस्ताक्षर में रिटर्न प्रकार शामिल करने वाली भाषा पहले से ही आपके द्वारा बताई गई समस्या को कम करने के तरीकों के साथ आ गई है। यह कोडन सम्मेलन, या सिर्फ मानक अभ्यास हो। नोट के अलावा, आप जो भी लिखते हैं उसमें से अधिकांश ऐसे तरीके नहीं बनाते हैं जो केवल रिटर्न प्रकार में भिन्न होते हैं। तो फिर, आप इसे बहुत बार नहीं करेंगे
चार्ल्स लैम्बर्ट

क्या कोई नियम होने में कोई कठिनाई होगी कि किसी दिए गए तर्क हस्ताक्षर के लिए केवल एक "प्राथमिक" विधि की घोषणा की जा सकती है, लेकिन एक माध्यमिक संख्या की एक मनमानी घोषणा की जा सकती है, और एक संकलक को पहले एक तर्क हस्ताक्षर की पहचान करके अतिभारित करना चाहिए जिसके लिए एक प्राथमिक विधि मौजूद है, और फिर कुछ निर्दिष्ट क्रम में माध्यमिक विधियों की जाँच कर यह देखने के लिए कि क्या कोई ऐसी विधि एक बेहतर ढंग से बेहतर मिलान थी (या प्राथमिक एक नहीं थी तो भी प्रयोग करने योग्य होगा)?
सुपरकैट

3

क्योंकि आप किसी विधि को कॉल कर सकते हैं और उसका परिणाम निर्दिष्ट नहीं कर सकते।


3
हर भाषा में नहीं।
जोर्ग डब्ल्यू मित्तग

@ जोर्ग किस भाषा की तरह?
चिरोन

1
f # एक भाषा है। आप आमतौर पर फू को देखते हैं -> अनदेखा करें जहां उपेक्षा एक प्रकार की वापसी इकाई है जो शून्य के समान है
चार्ल्स लैम्बर्ट

ऐडा इसका बेहतर उदाहरण है। वह भाषा वास्तव में हस्ताक्षर के हिस्से के रूप में रिटर्न प्रकार का उपयोग करती है।
चार्ल्स लैम्बर्ट

-4

अंगूठे का नियम: दृढ़ता से टाइप की गई भाषाएं आमतौर पर विधि हस्ताक्षर को रिटर्न प्रकार से बांधती हैं। कमजोर टाइप की भाषाएं नहीं।
मुझे C # नहीं पता है, लेकिन मुझे लगता है कि समस्या C # हैंडल जेनरिक के तरीके के कारण हो सकती है। यह सामान्य के लिए एक पूरी तरह से अलग विधि का निर्माण हो सकता है, जिस स्थिति में वे वास्तव में दो अलग-अलग विधियां हैं।


1
मुझे लगता है कि आप इनमें से किस तरह की टाइपिंग के लिए उत्सुक हैं? मुझे किसी का पता नहीं है, और मुझे पता है कि C ++ रिटर्न प्रकार के लिए स्पष्ट रूप से मना करता है।
ग्रेफेड

2
-1 यदि आप अंगूठे का एक नियम देने जा रहे हैं, जो एक उदाहरण के साथ ओस्टेंसिक रूप से गलत है, तो इसका उल्लंघन करने पर आपको यह पालन करना चाहिए कि अन्य सभी उदाहरणों के साथ जहां नियम का पालन किया जाता है।

@ ग्रेफेड, मेरा कहना यह था कि कमजोर टाइप की गई भाषाओं में संकलन समय पर असाइन नहीं किया जाता है। सहमत हूँ, कि यहाँ उचित नहीं हो सकता है।
सीएमआर

आपकी बात आपके गलत दावे से अस्पष्ट है कि "दृढ़ता से टाइप की जाने वाली भाषाएं आमतौर पर ... एक वापसी प्रकार के लिए बाध्य होती हैं"।
ग्रेफेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.