GHCi में:
Prelude> error (error "")
*** Exception:
Prelude> (error . error) ""
*** Exception: *** Exception:
पहले एक नेस्टेड अपवाद क्यों नहीं है?
GHCi में:
Prelude> error (error "")
*** Exception:
Prelude> (error . error) ""
*** Exception: *** Exception:
पहले एक नेस्टेड अपवाद क्यों नहीं है?
error
विशेष है और वास्तव में अपवाद तंत्र नहीं है। असली, देखने योग्य अपवादों में मोनाड दिखाई देता है Error
।
(\f g x -> f (g x)) error error ""
अलग (.) error error ""
कार्य करता है, भले ही वह फ़ंक्शन के बराबर हो (.)
। हो सकता है कि यह उन अनुकूलन झंडों के साथ हो, जिन्हें प्रिल्यूड ने संकलित किया था।
iterate error "" !! n
और भयानक fix error
।
error = error
और उसी के अनुसार कार्यक्रम करता हूं ।
जवाबों:
इसका उत्तर यह है कि यह (कुछ आश्चर्य की बात) आवेग अपवादों का शब्दार्थ है
शुद्ध कोड एक करने के लिए मूल्यांकन करने के लिए दिखाया जा सकता है जब सेट असाधारण मूल्यों का (का मान यानी error
या undefined
, और स्पष्ट रूप से नहीं अपवाद की तरह आईओ में उत्पन्न ), तो भाषा है कि सेट के किसी भी मान दिया जा करने के लिए अनुमति देता है। हस्केल में असाधारण मूल्य अधिक हैं NaN
जो फ्लोटिंग पॉइंट कोड में हैं, बजाय अनिवार्य भाषाओं में नियंत्रण-प्रवाह आधारित अपवादों के।
उन्नत Haskellers के लिए एक सामयिक गोचा एक मामला है जैसे:
case x of
1 -> error "One"
_ -> error "Not one"
चूंकि कोड अपवादों के एक सेट का मूल्यांकन करता है, जीएचसी एक लेने के लिए स्वतंत्र है। अनुकूलन के साथ, आप अच्छी तरह से यह हमेशा "नहीं" का मूल्यांकन कर सकते हैं।
हम ऐसा क्यों करते हैं? क्योंकि अन्यथा हम भाषा के मूल्यांकन क्रम पर अत्यधिक दबाव डालते हैं, उदाहरण के लिए हमें इसके लिए एक निर्धारक परिणाम तय करना होगा:
f (error "a") (error "b")
उदाहरण के लिए, यह आवश्यक है कि त्रुटि मान मौजूद होने पर इसे बाएं से दाएं मूल्यांकन किया जाए। बहुत अन-हास्केली!
चूंकि हम उन आशाओं को अपंग नहीं करना चाहते हैं जो हमारे कोड पर केवल समर्थन के लिए की जा सकती हैं error
, इसलिए समाधान यह निर्दिष्ट करना है कि परिणाम असाधारण मूल्यों के सेट से एक गैर-निर्धारक विकल्प है: अपवादों को लागू करें! एक तरह से, सभी अपवाद वापस आ जाते हैं, और एक को चुना जाता है।
आम तौर पर, आप परवाह नहीं करते हैं - एक अपवाद एक अपवाद है - जब तक आप अपवाद के अंदर स्ट्रिंग के बारे में परवाह नहीं करते हैं, जिसमें error
डीबग का उपयोग करने का मामला अत्यधिक भ्रामक है।
संदर्भ: अभेद्य अपवादों के लिए एक शब्दार्थ , साइमन पेटन जोन्स, एलेस्टेयर रीड, टोनी होरे, साइमन मार्लो, फर्गस हेंडरसन। प्रोक प्रोग्रामिंग लैंग्वेज डिजाइन एंड इम्प्लीमेंटेशन (PLDI'99), अटलांटा। ( पीडीएफ )
throw
) और आप निर्धारित कर सकते हैं कि आप इसके साथ अपवाद को फेंक सकते हैं throwIO
।
case error "banana" of (x:xs) -> error "bonobo"
आपको दे सकते हैं * Exception: bonobo
।