कुछ क्या आप की सोच रहे हैं कहा जाता है 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
'अनिर्धारित' का उपयोग करें। जब आप फ़ंक्शन का आह्वान करते हैं, तो आपको '*** अपवाद: Prelude.undefined' मिलेगा। –
वैकल्पिक रूप से, 'isDivisor x y = त्रुटि "अभी तक लागू नहीं किया गया है"', या, यदि आप ghci को लूप चाहते हैं, 'isDivisor x y = isDivisor x y' है। –