2013-05-22 11 views
7

यदि मुझे स्कूल से सही तरीके से याद है, तो एक फ़ंक्शन या कीवर्ड है जिसका उपयोग "अभी तक लागू नहीं किया गया" के लिए किया जाता है लेकिन कोड संकलित करता है। मैंने इसे खोजने की कोशिश की है, लेकिन नहीं मिल सका। कोई भी जानता है कि मैं क्या देख रहा हूं?"कोई ऑपरेशन नहीं है" हैकेल

है की तरह

isDivisor :: Integer -> Integer -> Bool 
isDivisor x y = None 
--isDivisor x y = (rem x y) == 0 
+1

'अनिर्धारित' का उपयोग करें। जब आप फ़ंक्शन का आह्वान करते हैं, तो आपको '*** अपवाद: Prelude.undefined' मिलेगा। –

+1

वैकल्पिक रूप से, 'isDivisor x y = त्रुटि "अभी तक लागू नहीं किया गया है"', या, यदि आप ghci को लूप चाहते हैं, 'isDivisor x y = isDivisor x y' है। –

उत्तर

8

कुछ क्या आप की सोच रहे हैं कहा जाता है bottom

नीचे बस कुछ दिखा लागू नहीं है के लिए नहीं है, यह एक गणना है जो हमारे कार्यक्रम का कारण बनता है को दिखाने के लिए है असफल होना।

उदाहरण के लिए हम वास्तव में undefined खुद अनंत लूप के रूप में परिभाषित कर सकते हैं

undefined = let x = x in x 
undefined = undefined 

तो सच है कि हम क्या कर रहे हैं सिर्फ एक मूल्य undefined :: a में डाल रहा है जो कारण होगा या दुर्घटना कार्यक्रम के लिए या पाश हमेशा के लिए है, लेकिन कभी नहीं इसका मूल्यांकन

इसलिए यदि आप कुछ बड़े और जटिल समारोह है कि आप सिर्फ इस

foo :: Bar -> Baz -> Quux 
foo bar baz = foo bar baz 

कर सकता है इस typechecks के बाद से लागू करने के लिए पता नहीं कैसे है, यह संकलन करेंगे और हम के अन्य भागों परीक्षण कर सकते हैं हमारी कार्यक्रम।

हालांकि जब आप गलती से प्रोग्राम के उस भाग को चलाते हैं तो यह अनंत लूप होने के लिए बहुत ही अनुपयोगी है, इसलिए जीएचसी और अन्य undefined को अलग-अलग तरीके से लागू करते हैं।

-- In GHC 
error msg = throw (ErrorCall s) 
undefined = error "Prelude.undefined" 

तो एक समारोह बेहतर डिबगिंग क्षमताओं

foo bar baz = undefined 
foo bar baz = error ("Tried to evaluate foo with" ++ show bar ++ show baz) 

आप नीचे भ्रामक है, Hammar की अवधारणा पता लगा रहे हैं के साथ अपरिभाषित छोड़ने के लिए: वे उन्हें कार्यक्रम दुर्घटना और एक त्रुटि संदेश फेंकना, जैसे है एक महान answer