गोलांग / हास्केल में प्रकार का अनुमान


9

मैंने पढ़ा है कि गो को वास्तव में इस अर्थ में सही प्रकार का अनुमान नहीं है कि कार्यात्मक भाषाएं जैसे कि एमएल या हास्केल है, लेकिन मैं दो संस्करणों की तुलना को समझने में सरल नहीं हो पाया हूं। क्या कोई व्यक्ति मूल शब्दों में समझा सकता है कि गो में किस प्रकार का हस्तक्षेप हास्केल में प्रकार के इंजेक्शन से भिन्न होता है, और प्रत्येक के पेशेवरों / विपक्षों में?

जवाबों:


13

Go के प्रकार के निष्कर्ष के बारे में यह StackOverflow उत्तर देखें । मैं स्वयं जाने से परिचित नहीं हूँ, लेकिन इस उत्तर के आधार पर यह एक तरह से "टाइप डिडक्शन" (कुछ C ++ टेम्पोरोलॉजी को उधार लेने के लिए) जैसा लगता है। इसका मतलब है कि अगर आपके पास:

x := y + z

फिर प्रकार का xपता लगाकर घटाया जाता है y + z, जो संकलक के लिए एक अपेक्षाकृत तुच्छ चीज है। ऐसा करने के लिए, के प्रकार yऔर एक प्राथमिकताz को जानने की जरूरत है : यह प्रकार एनोटेशन के माध्यम से किया जा सकता है या उन्हें सौंपे गए शाब्दिक से अनुमान लगाया जा सकता है।


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

let x = y + z

तब हास्केल न केवल, xबल्कि केवल yऔर zकेवल इस तथ्य पर आधारित हो सकता है कि आप उन पर अतिरिक्त प्रदर्शन कर रहे हैं। इस मामले में:

x :: Num a => a
y :: Num a => a
z :: Num a => a

( aयहां का निचला हिस्सा एक बहुरूप प्रकार को दर्शाता है , जिसे अक्सर C ++ जैसी अन्य भाषाओं में "जेनरिक" कहा जाता है। यह संकेत देने के लिए कि बाधा को जोड़ने के लिए Num a =>एक बाधा है a

यहां एक और दिलचस्प उदाहरण है: फिक्स्ड-पॉइंट कॉम्बिनेटर जो किसी भी पुनरावर्ती कार्य को परिभाषित करने की अनुमति देता है:

let fix f = f (fix f)

ध्यान दें कि कहीं भी हमने इसका प्रकार निर्दिष्ट नहीं किया है f, न ही हमने इसके प्रकार को निर्दिष्ट किया है fix, फिर भी हास्केल संकलक स्वचालित रूप से पता लगा सकता है:

f :: t -> t
fix :: (t -> t) -> t

यह कहता है कि:

  • पैरामीटर fको कुछ मनमाने प्रकार tसे एक ही प्रकार का एक फ़ंक्शन होना चाहिए t
  • fixएक फ़ंक्शन है जो प्रकार का एक पैरामीटर प्राप्त करता है t -> tऔर प्रकार का एक परिणाम देता है t

4
अधिक वास्तव में, हास्केल कि बता सकते हैं x, y, zएक ही हैं Num, एरिक प्रकार लेकिन वे अभी भी हो सकता है Integerरों, Doubleरों, Ratio Integerएस ... हास्केल सांख्यिक प्रकार के बीच एक मनमाना विकल्प बनाने के लिए तैयार है, लेकिन अन्य typeclasses के लिए नहीं है।
जॉन ड्वोरक

7

गो में प्रकार का अनुमान बेहद सीमित और बेहद सरल है। यह केवल एक भाषा निर्माण (वैरिएबल डिक्लेरेशन) में काम करता है और यह केवल राइट-हैंड साइड का प्रकार लेता है और इसे लेफ्ट-हैंड साइड पर वेरिएबल के प्रकार के रूप में उपयोग करता है।

हास्केल में टाइप इंट्रैक्शन हर जगह इस्तेमाल किया जा सकता है, इसका इस्तेमाल पूरे प्रोग्राम के लिए टाइप करने के लिए किया जा सकता है। यह एकीकरण पर आधारित है, जिसका अर्थ है कि (वैचारिक रूप से) सभी प्रकार "एक ही बार में" हैं और वे सभी एक दूसरे को प्रभावित कर सकते हैं: गो में, प्रकार की जानकारी केवल एक चर घोषणा के दाईं ओर से बाईं ओर बह सकती है- हाथ की ओर, दूसरी दिशा में कभी नहीं और एक चर घोषणा के बाहर कभी नहीं; हास्केल में, पूरे कार्यक्रम के माध्यम से सभी दिशाओं में स्वतंत्र रूप से जानकारी प्रवाहित होती है।

हालांकि, हास्केल का प्रकार प्रणाली इतनी शक्तिशाली है कि प्रकार का अनुमान वास्तव में एक प्रकार का अनुमान लगाने में विफल हो सकता है (या अधिक सटीक: प्रतिबंधों को जगह में रखना पड़ता है ताकि एक प्रकार हमेशा अनुमान लगाया जा सके)। गो की प्रणाली इतनी सरल है (कोई उपप्रकार, कोई पैरामीट्रिक बहुरूपता नहीं है) और इसका अनुमान इतना सीमित है कि यह सफल नहीं होता है।


4
"हास्केल में, पूरे कार्यक्रम के माध्यम से सभी दिशाओं में स्वतंत्र रूप से जानकारी प्रवाहित होती है": मुझे लगता है कि यह बहुत अच्छा अंतर्ज्ञान देता है। +1
जियोर्जियो

अंतिम पैराग्राफ में यह उत्तर जो दावे करता है, वे थोड़े भ्रामक हैं। हास्केल में कोई उपप्रकार नहीं है। इसके अलावा, पैरामीट्रिक बहुरूपता प्रकार की पूर्णता के लिए कोई समस्या पैदा नहीं करता है: पॉलीमोर्फिक लैम्ब्डा कैलकुलस पर हिंडले-मिलनर हमेशा सबसे सामान्य प्रकार पाता है। हास्केल प्रकारों का पता लगाने में विफल हो सकता है, लेकिन यह जीएडीटी जैसे परिष्कृत प्रकार के सिस्टम फीचर्स पर होगा, जहां, जब औपचारिक रूप से तैयार किया जाता है, तो कोई प्रिंसिपल (यानी, "सर्वश्रेष्ठ विकल्प") प्रकार मौजूद नहीं होता है।
एडवर्ड जेड। यांग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.