जैसा कि शीर्षक कहता है: हास्केल फ़ंक्शन रिटर्निंग यूनिट के मूल्यांकन की क्या गारंटी है? कोई सोचता है कि इस तरह के मामले में किसी भी तरह के मूल्यांकन को चलाने की कोई आवश्यकता नहीं है, कंपाइलर ऐसे सभी कॉल को तत्काल ()
मूल्य के साथ बदल सकता है जब तक कि सख्ती के लिए स्पष्ट अनुरोध मौजूद नहीं हैं, इस मामले में कोड को यह तय करना होगा कि क्या होना चाहिए वापस ()
या नीचे।
मैंने जीएचसीआई में इसके साथ प्रयोग किया है, और ऐसा लगता है कि इसके विपरीत होता है, अर्थात्, इस तरह के फ़ंक्शन का मूल्यांकन किया जाता है। एक बहुत ही आदिम उदाहरण होगा
f :: a -> ()
f _ = undefined
मूल्यांकन f 1
की उपस्थिति के कारण एक त्रुटि फेंकता है undefined
, इसलिए कुछ मूल्यांकन निश्चित रूप से होता है। यह स्पष्ट नहीं है कि मूल्यांकन कितना गहरा है, हालांकि; कभी-कभी यह उतना ही गहरा प्रतीत होता है जितना कि लौटने वाले कार्यों के लिए सभी कॉल का मूल्यांकन करना आवश्यक है ()
। उदाहरण:
g :: [a] -> ()
g [] = ()
g (_:xs) = g xs
यदि यह कोड अनिश्चित काल के लिए प्रस्तुत किया जाता है g (let x = 1:x in x)
। परन्तु फिर
f :: a -> ()
f _ = undefined
h :: a -> ()
h _ = ()
उस h (f 1)
रिटर्न को दिखाने के लिए इस्तेमाल किया जा सकता है ()
, इसलिए इस मामले में सभी यूनिट-वैल्यू वाले सबएक्सप्रेस का मूल्यांकन नहीं किया जाता है। यहाँ सामान्य नियम क्या है?
ETA: बेशक मुझे आलस के बारे में पता है। मैं पूछ रहा हूँ कि संकलक लेखकों को इस विशेष मामले को आम तौर पर संभव से भी हल्का बनाने से रोकता है।
ईटीए 2: उदाहरणों का सारांश: जीएचसी ()
बिल्कुल किसी अन्य प्रकार के रूप में व्यवहार करता है, जैसे कि एक सवाल था कि किस प्रकार के नियमित मूल्य के प्रकार को एक फ़ंक्शन से वापस किया जाना चाहिए। तथ्य यह है कि केवल एक ही ऐसा मूल्य है जो अनुकूलन एल्गोरिदम द्वारा उपयोग किया गया प्रतीत नहीं होता है (ab)।
ETA3: जब मैं हास्केल कहता हूं, तो मेरा मतलब है हास्केल-जैसा-परिभाषित-दर-रिपोर्ट, न कि हास्केल-ए-एच-इन-जीएचसी। लगता है कि एक धारणा के रूप में व्यापक रूप से साझा नहीं किया गया था जैसा कि मैंने कल्पना की थी (जो 'पाठकों के 100% द्वारा' था), या मैं शायद एक स्पष्ट प्रश्न तैयार कर सकता था। फिर भी, मुझे सवाल के शीर्षक को बदलने पर पछतावा है, क्योंकि यह मूल रूप से पूछा गया है कि इस तरह के एक समारोह के लिए क्या गारंटी है ।
ETA4: ऐसा लगेगा कि इस प्रश्न ने अपना पाठ्यक्रम चला दिया है, और मैं इसे अनुत्तरित मान रहा हूं। (मैं 'एक करीबी प्रश्न' समारोह की तलाश में था, लेकिन केवल 'अपने ही प्रश्न का उत्तर पाया' और जैसा कि इसका उत्तर नहीं दिया जा सकता है, मैं उस मार्ग से नीचे नहीं गया।) किसी ने भी रिपोर्ट में से कुछ भी नहीं लाया है जो इसे तय करेगा। , जो मुझे एक मजबूत, लेकिन निश्चित रूप से व्याख्या करने के लिए लुभाता है, लेकिन इस तरह के उत्तर के लिए भाषा की कोई गारंटी नहीं है। हम सभी जानते हैं कि वर्तमान जीएचसी कार्यान्वयन इस तरह के फ़ंक्शन का मूल्यांकन नहीं करेगा।
हास्केल के लिए एक OCaml ऐप पोर्ट करते समय मैंने वास्तविक समस्या में भाग लिया है। मूल ऐप में कई प्रकारों की पारस्परिक रूप से पुनरावर्ती संरचना थी, और कोड ने assert_structureN_is_correct
1..6 या 7 में एन के लिए कई प्रकार के फ़ंक्शन की घोषणा की , जिनमें से प्रत्येक यूनिट वापस आ गई यदि संरचना वास्तव में सही थी और अपवाद नहीं थी, अगर यह नहीं थी । इसके अलावा, इन कार्यों ने एक-दूसरे को बुलाया क्योंकि उन्होंने शुद्धता की स्थिति को विघटित कर दिया। हास्केल में यह बेहतर तरीके से Either String
संन्यासी का उपयोग करता है , इसलिए मैंने इसे इस तरह से स्थानांतरित किया, लेकिन एक सैद्धांतिक मुद्दे के रूप में सवाल बना रहा। सभी इनपुट और उत्तर के लिए धन्यवाद।
f 1
"प्रतिस्थापित" है undefined
।
... -> ()
1) समाप्त कर सकता है और वापस आ सकता है ()
, 2) एक अपवाद / रनटाइम त्रुटि के साथ समाप्त होता है और कुछ भी वापस करने में विफल रहता है, या 3) डायवर्ज (अनंत पुनरावर्तन)। जीएचसी केवल 1 मान लेने वाले कोड का अनुकूलन नहीं करता है) हो सकता है: यदि f 1
मांग की जाती है, तो यह अपने मूल्यांकन को नहीं छोड़ता है और वापस लौटता है ()
। हास्केल शब्दार्थ इसका मूल्यांकन करना है और देखना है कि 1,2,3 के बीच क्या होता है।
()
इस प्रश्न में (या तो प्रकार या मूल्य) के बारे में वास्तव में कुछ खास नहीं है । यदि आप हर जगह () :: ()
, कहते हैं, सभी समान अवलोकन होते हैं 0 :: Int
। ये सभी आलसी मूल्यांकन के पुराने उबाऊ परिणाम हैं।
()
, ()
और undefined
।
h1::()->() ; h1 () = ()
औरh2::()->() ; h2 _ = ()
। दोनों भागोh1 (f 1)
औरh2 (f 1)
, और देखते हैं कि केवल पहले एक की मांग(f 1)
।