क्या गो-भाषा के लिए हिंडले-मिल्नर निष्कर्ष निकाल सकते हैं?


22

मैंने वो पढ़ा है हिंडले-मिलनर उप-प्रकारों वाले सिस्टम के साथ काम नहीं करता है, और अन्य प्रकार के सिस्टम फीचर्स हैं जो इसके साथ अच्छी तरह से काम नहीं करते हैं। वर्तमान में जाओ :=ऑपरेटर में केवल बहुत सीमित प्रकार का अनुमान है । लेकिन गो के पास पारंपरिक अर्थों में उपवर्ग नहीं हैं, केवल इंटरफेस जो बहुत हद तक हास्केल के प्रकार की कक्षाओं की तरह दिखते हैं जो हिंडले-मिलनर इंट्रेंस के साथ ठीक काम करते हैं।

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

जवाबों:


35

Hindley-Milner प्रकार का प्रयोग Hindley-Milner प्रकार सिस्टम के लिए उपयोग किया जाता है, सिस्टम-एफ प्रकार सिस्टम का प्रतिबंध। एचएम प्रकार प्रणालियों की दिलचस्प विशेषता यह है कि उनके पास है पैरामीट्रिक पॉलीमॉर्फिज़्म (उर्फ जेनरिक) है। यह एक सबसे बड़ी प्रकार की प्रणाली की विशेषता है जिसे गोलंग ने मना कर दिया है।

उस निराशाजनक प्रतिबंध के साथ, एचएम-शैली प्रकार का अनुमान असंभव है। आइए अनछुए कोड को देखें:

func f(a) {
  return a.method()
}

किस प्रकार का है f? हम देख सकते हैं कि aएक विधि होनी चाहिए, इसलिए हम एक अनाम इंटरफ़ेस का उपयोग कर सकते हैं func f(a interface { method() ??? }) ???:। हालांकि, हमें पता नहीं है कि वापसी का प्रकार क्या है। प्रकार चर के साथ, हम प्रकार की घोषणा कर सकते हैं

func f[T](a interface{ method() T }) T

हालाँकि, गो में प्रकार चर नहीं हैं इसलिए यह काम नहीं करेगा। जबकि निहित इंटरफेस प्रकार के अनुमान के कुछ पहलुओं को आसान बनाते हैं, अब हमारे पास फ़ंक्शन कॉल के रिटर्न प्रकार का पता लगाने का कोई तरीका नहीं है। एचएम-सिस्टम को निहित होने के बजाय सभी कार्यों को घोषित करने की आवश्यकता होती है, और प्रत्येक नाम में केवल एक ही प्रकार हो सकता है (जबकि गो के तरीके अलग-अलग इंटरफेस में अलग-अलग प्रकार के हो सकते हैं)।

इसके बजाय, गो की आवश्यकता है कि फ़ंक्शन हमेशा पूरी तरह से घोषित किए जाते हैं, लेकिन चर प्रकार का उपयोग करने की अनुमति देता है। यह संभव है क्योंकि एक असाइनमेंट के दाहिने हाथ की ओरvariable := expression पहले से ही कार्यक्रम के उस बिंदु पर एक ज्ञात प्रकार है। इस तरह के प्रकार का अनुमान सरल, सही और रैखिक है।

  • एक चर के प्रकार को तुरंत घोषणा के बिंदु पर जाना जाता है, जबकि एचएम इंट्रेंस को पहले पूरे कार्यक्रम को संभावित रूप से टाइप-चेक करना पड़ता है। यह त्रुटि संदेशों की गुणवत्ता पर भी ध्यान देने योग्य प्रभाव डालता है।
  • एचएम के विपरीत, गो का प्रकार का निष्कर्ष दृष्टिकोण हमेशा एक चर के लिए सबसे विशिष्ट प्रकार का चयन करेगा, जो सबसे सामान्य प्रकार को चुनता है। गो के निहित इंटरफेस के साथ, यह उप-सफाई के साथ सफाई से काम करता है।

24
@ बिशप यह "तर्क" के छोटे मूल्यों के लिए "तर्क" है।
हॉब्स

18
@bishop ने जेनरिक के साथ भाषाओं में संकलक का काम किया है, मैं निश्चित रूप से सहमत हो सकता हूं: कार्यान्वयन को जटिल किए बिना इसे लागू करना मुश्किल है। मैं "असंभव" के साथ "असंभव" को बदलने के लिए इतनी दूर तक जाऊंगा। हालाँकि, यह बात नहीं है; बिंदु यह है, क्या यह अतिरिक्त जटिलता के लायक है? और जवाब, जो किसी के साथ और बिना जेनरिक के काम किया है, जाहिर है "हाँ, निश्चित रूप से!" मुझे इस दावे के साथ पूरी ईमानदारी से सहमत होना चाहिए कि जेनरिक को लागू करने से मना करना क्योंकि "ओह नहीं, जटिलता" मुहावरा है।
मेसन व्हीलर

18
यही कारण है कि गो देवता यह दिखावा करते हैं कि सभी प्रकार की एफपी खराब है; जाओ शाब्दिक बंद के साथ प्रथम श्रेणी के कार्य करता है, और कहा कि उच्च क्रम कार्यों बनाने की क्षमता है, लेकिन यह उन्हें किसी भी अच्छा उपयोग करने के लिए डाल करने के लिए असंभव है क्योंकि इस तरह के बुनियादी कार्यों के प्रकार के रूप में map, filterहै, और reduceसभी जाओ के बहुत सीमित भीतर अकथनीय हैं प्रकार प्रणाली।
हॉब्स

9
@ होब्स एंड गो एक बहुत अच्छी भाषा हो सकती है अगर इसे ठीक कर दिया जाए, लेकिन इसके बजाय लोगों को जेनेरिक-जेनरेशन लाइब्रेरियों को लिखना होगा gengenऔरgonerics
बिल्ली

14
@ यह शर्म की बात है। पहले तो गो महान विचारों से भरी एक महान भाषा की तरह प्रतीत होती है, लेकिन तब आपको एहसास होता है कि इसमें कोई विरासत और बहुरूपता नहीं है, इसलिए आप OOP को अच्छी तरह से नहीं कर सकते हैं, और इसमें कोई जेनरिक नहीं है, इसलिए आप FP को अच्छी तरह से नहीं कर सकते हैं, और आप "स्क्रीन पर रिक्त रूप से घूरते हुए पूछ रहा है" फिर आप वास्तव में इस भाषा का उपयोग कैसे करने वाले हैं? "
मेसन व्हीलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.