मैंने बस दूसरे दिन learnyouahaskell समाप्त किया , और मैं हास्केल विकी द्वारा वर्णित मोनोमोर्फिज्म प्रतिबंध की भावना बनाने की कोशिश कर रहा था । मुझे लगता है कि मैं समझता हूं कि एमआर दोहराए गए मूल्यांकन को कैसे रोक सकता है, लेकिन मैं यह देखने में असफल रहा हूं कि उन दोहराया मूल्यांकन को अधिक सरल साधनों से क्यों नहीं बचा जा सकता है।
विशिष्ट उदाहरण जो मेरे दिमाग में है वह विकि द्वारा उपयोग किया गया है:
f xs = (len,len)
where
len = genericLength xs
जहां genericLength
इस प्रकार का है Num a => [b] -> a
।
जाहिर है, genericLength xs
केवल एक बार मूल्यांकन करने के लिए गणना करने की आवश्यकता है (len,len)
, क्योंकि यह समान तर्कों के साथ एक ही कार्य है। और हमें यह जानने के लिए किसी इनवोकेशन को देखने की आवश्यकता नहीं f
है। तो एमआरएस जैसे नियम को पेश किए बिना हास्केल इस अनुकूलन को क्यों नहीं कर सकते?
उस विकी पृष्ठ पर चर्चा मुझे बताती है कि Num
इसका इस तथ्य से कुछ लेना- देना है कि यह एक ठोस प्रकार के बजाय एक टाइपकास्ट है, लेकिन फिर भी, संकलन-समय पर यह स्पष्ट नहीं होना चाहिए कि एक शुद्ध कार्य समान मान लौटाएगा- -और इस प्रकार एक ही ठोस प्रकार की संख्या - दो बार एक ही तर्क दिए जाने पर?
f [] :: (Int, Float)
। अब यह सही समझ में आता है। धन्यवाद।