हास्केल मोनोमोर्फिस्म प्रतिबंध के बिना बार-बार मूल्यांकन से बचने में असमर्थ क्यों है?


14

मैंने बस दूसरे दिन learnyouahaskell समाप्त किया , और मैं हास्केल विकी द्वारा वर्णित मोनोमोर्फिज्म प्रतिबंध की भावना बनाने की कोशिश कर रहा था । मुझे लगता है कि मैं समझता हूं कि एमआर दोहराए गए मूल्यांकन को कैसे रोक सकता है, लेकिन मैं यह देखने में असफल रहा हूं कि उन दोहराया मूल्यांकन को अधिक सरल साधनों से क्यों नहीं बचा जा सकता है।

विशिष्ट उदाहरण जो मेरे दिमाग में है वह विकि द्वारा उपयोग किया गया है:

f xs = (len,len)
  where
    len = genericLength xs

जहां genericLengthइस प्रकार का है Num a => [b] -> a

जाहिर है, genericLength xsकेवल एक बार मूल्यांकन करने के लिए गणना करने की आवश्यकता है (len,len), क्योंकि यह समान तर्कों के साथ एक ही कार्य है। और हमें यह जानने के लिए किसी इनवोकेशन को देखने की आवश्यकता नहीं fहै। तो एमआरएस जैसे नियम को पेश किए बिना हास्केल इस अनुकूलन को क्यों नहीं कर सकते?

उस विकी पृष्ठ पर चर्चा मुझे बताती है कि Numइसका इस तथ्य से कुछ लेना- देना है कि यह एक ठोस प्रकार के बजाय एक टाइपकास्ट है, लेकिन फिर भी, संकलन-समय पर यह स्पष्ट नहीं होना चाहिए कि एक शुद्ध कार्य समान मान लौटाएगा- -और इस प्रकार एक ही ठोस प्रकार की संख्या - दो बार एक ही तर्क दिए जाने पर?

जवाबों:


11

यह एक ही फ़ंक्शन नाम है, एक ही तर्क के साथ, लेकिन संभावित रूप से विभिन्न प्रकार के रिटर्न और कार्यान्वयन, क्योंकि यह बहुरूपी है। इसका मतलब यह है कि अगर इसे (Int, MyWeirdCustomNumType)रिटर्न प्रकार की उम्मीद के संदर्भ में कहा जाता है , तो इसे दो बार इसका मूल्यांकन करना होगा, क्योंकि इनका कार्यान्वयन (+)अंदर Intसे पूरी तरह से अलग (+)है MyWeirdCustomNumType। आपको कुछ बिंदु पर शारीरिक रूप से अलग कोड चलाने की आवश्यकता है।

इसलिए यह मायने रखता है कि Numयह एक प्रकार का वर्ग है। इसका मतलब है कि आपके पास विभिन्न प्रकारों के लिए अलग-अलग कार्यान्वयन हैं। इसका मतलब यह भी है कि अगर fपुस्तकालय में है, तो यह सभी प्रकार के संयोजन के बारे में संकलन समय पर नहीं जानता है कि इसे वापस करने की आवश्यकता हो सकती है।

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


मैंने इसकी संभावना पर विचार नहीं किया था f [] :: (Int, Float)। अब यह सही समझ में आता है। धन्यवाद।
Ixrec

1
It's the same function name, with the same arguments, but potentially different return types and implementations, because it's polymorphic.मुझे लगता है कि इसे देखने का बेहतर तरीका यह है कि टाइपकास्ट उदाहरण प्रभावी रूप से एक अतिरिक्त तर्क है genericLengthऔर संकलक को यह विश्वास नहीं है कि यह दोनों कॉल में समान तर्क है।
डोभाल

क्विक साइड सवाल। यदि MonomorphismRestriction बंद है, लेकिन बाद में आपने ऐसा कुछ किया है तो a = uncurry (==) $ f [1, 2, 3]क्या यह कॉल साइट को केवल [1, 2, 3]एक बार की लंबाई की जांच करने में सक्षम होगा ? यदि ऐसा है तो मैं वास्तव में उलझन में हूं कि मोनोमोर्फिज्म प्रतिबंध वास्तव में आपको क्या खरीद रहा है, यदि नहीं तो क्यों नहीं?
अर्धविराम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.