2011-08-24 12 views
14

आप निम्नलिखित है कहो। जहां तक ​​मैं देख सकता हूं, इसका कारण यह है कि foo ("asdf") में एक अच्छी तरह से परिभाषित प्रकार नहीं है (यह या तो Int => Int या Double => Int) है।स्काला, currying और अधिक भार

वहाँ एक कारण है कि इस तरह के "polytyped" कार्यों अनुमति नहीं होनी चाहिए है?

+0

https://issues.scala-lang.org/browse/SI-2628 – Bradford

+0

स्कैला आपको ओवरलोडेड विधियों की उस जोड़ी को परिभाषित करने की अनुमति देता है, लेकिन नीचे दिए गए मार्टिन द्वारा उल्लिखित कारणों के लिए यह किसी भी कॉल अस्पष्ट है। प्रासंगिक: http://stackoverflow.com/questions/2510108/why-avoid-method-overloading – retronym

उत्तर

19

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

xs.corresponds(ys) { (x, y) => x < y } 

ध्यान दें कि यहाँ हम आदेश x और y के प्रकार अनुमान लगाने के लिए में corresponds के प्रकार पता करने की जरूरत: इस तरह मुहावरों सक्षम बनाता है। corresponds ओवरलोड होने पर यह ब्रेक डाउन करना शर्म की बात होगी।

+0

उत्तर के लिए धन्यवाद। फॉलो-अप के रूप में, संभवतः संभव प्रकारों की एक सूची होनी चाहिए जो x और y को असाइन किए जा सकें, इस बात के आधार पर कि अनुरूपता के ओवरलोड किए गए संस्करण दायरे में हैं (इसी तरह के प्रभावों के समान) और बस निर्णय लें केवल तभी टाइप करें जब आपको करना होगा? या क्या यह स्थिर टाइपिंग के विचार के खिलाफ होगा? –

+0

@ मार्टिन ओडरस्की आप देख सकते हैं http://stackoverflow.com/q/7291168 धन्यवाद! –

+2

किसी भी दृष्टिकोण जो संभव प्रकार की सूचियों को समझता है, टाइपिंग समय के घातीय विस्फोट का जोखिम उठाता है। यही कारण है कि स्कैला आम तौर पर इसके प्रकार अनुमान एल्गोरिदम में नहीं करता है। –

2

यह पहली बार इस लिए कहा गया है नहीं है: it was asked back in 2009। दुर्भाग्यवश मार्टिन ने स्पष्ट रूप से यह नहीं बताया कि समस्याएं क्या थीं, इसके अलावा इसे ओवरलोडिंग कार्यों के बारे में काफी व्यापक बदलाव की आवश्यकता होगी। मैंने कल्पना को देखा है और यह मुझे स्पष्ट नहीं है कि मूल मुद्दे कहां झूठ बोलते हैं, लेकिन मैं किसी भी तरह का एक निश्चित उत्तर देने के लिए पर्याप्त कुशल नहीं हूं।

+1

यह थोड़ा अलग मुद्दा है। जिस प्रश्न से आप लिंक करते हैं, आपके पास दो कार्य होते हैं, जो केवल उनके रिटर्न प्रकारों में भिन्न होंगे ('foo (x: bar): यूनिट 'बनाम' foo (x: bar): फंक्शन 1 [बार => बाज़, यूनिट] ') यदि मेरा तर्क सही है (अभी भी पूरी तरह से आश्वस्त नहीं है ...) – Dirk

+0

मुझे नहीं पता कि _issue_ अलग क्यों है। जिन शर्तों के तहत समस्या प्रकट हुई है वे अलग हो सकते हैं लेकिन मुझे लगता है कि यह मुद्दा वही है। मैंने सभी प्रकार के मैनिप्लेशंस की कोशिश की है लेकिन त्रुटि कभी नहीं बदली है। मैंने पढ़ा है कि, अधिभार बहुत जल्दी किया जाता है, या "एक्स" पर प्राथमिकता लेता है। –

+0

मुझे यकीन नहीं है कि यह वही है। आपके द्वारा लिंक किए गए स्कैला मुद्दे में, दो कार्य होने का अर्थ होगा, क्योंकि foo() और foo() _ अलग हैं, जबकि वर्तमान स्थिति में, दो संभावित foo() को व्यक्त करने के विभिन्न तरीके नहीं हैं _ कार्य अंतर्निहित कारण एक जैसा हो सकता है, लेकिन मुझे विश्वास नहीं है। मुझे लगता है कि वास्तव में Dirk बिंदु भी था। –

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