ठीक है, हास्केल में त्रुटि से निपटने का पहला नियम: कभी भी उपयोग न करेंerror
।
यह हर तरह से भयानक है। यह विशुद्ध रूप से इतिहास के एक अधिनियम के रूप में मौजूद है और प्रेडल इसे उपयोग करने वाले तथ्य भयानक है। इसका उपयोग न करें।
जब आप इसका उपयोग कर सकते हैं तब केवल अनुमान योग्य समय होता है जब कोई चीज इतनी आंतरिक रूप से भयानक होती है कि वास्तविकता के बहुत कपड़े के साथ कुछ गलत होना चाहिए, इस प्रकार यह आपके प्रोग्राम मूट के परिणाम का प्रतिपादन करता है।
अब सवाल Maybe
बनाम बन जाता है Either
। Maybe
अच्छी तरह से कुछ के लिए अनुकूल है head
, जो मान वापस कर सकता है या नहीं कर सकता है लेकिन असफल होने का केवल एक संभावित कारण है। Nothing
कुछ ऐसा कह रहा है जैसे "यह टूट गया, और आप पहले से ही जानते हैं कि क्यों"। कुछ लोग कहेंगे कि यह एक आंशिक कार्य को इंगित करता है।
त्रुटि से निपटने का सबसे मजबूत रूप Either
+ ADT एक त्रुटि है।
उदाहरण के लिए मेरे एक शौक कंपाइलर में, मुझे कुछ पसंद है
data CompilerError = ParserError ParserError
| TCError TCError
...
| ImpossibleError String
data ParserError = ParserError (Int, Int) String
data TCError = CouldntUnify Ty Ty
| MissingDefinition Name
| InfiniteType Ty
...
type ErrorM m = ExceptT CompilerError m -- from MTL
अब मैं त्रुटि प्रकार के एक समूह को परिभाषित करता हूं, उन्हें घोंसला बनाता हूं ताकि मेरे पास एक शानदार शीर्ष स्तरीय त्रुटि हो। यह संकलन या ImpossibleError
ए के किसी भी चरण से एक त्रुटि हो सकती है , जो एक कंपाइलर बग को दर्शाता है।
इनमें से प्रत्येक त्रुटि प्रकार सुंदर छपाई या अन्य विश्लेषण के लिए यथासंभव अधिक से अधिक जानकारी रखने की कोशिश करता है। इससे भी महत्वपूर्ण बात यह है कि एक स्ट्रिंग नहीं होने से मैं यह जांच कर सकता हूं कि टाइप चेकर के माध्यम से एक अनटिप्ड प्रोग्राम चलाने से वास्तव में एक यूनिफिकेशन एरर उत्पन्न होता है! एक बार कुछ होने के बाद String
, यह हमेशा के लिए चला गया है और इसमें निहित कोई भी जानकारी संकलक / परीक्षणों के लिए अपारदर्शी है, इसलिए अभी Either String
भी महान नहीं है।
अंत में मैं इस प्रकार को ExceptT
एमटीएल से एक नया मोनाड ट्रांसफार्मर में पैक करता हूं । यह अनिवार्य रूप से है EitherT
और शुद्ध, सुखद तरीके से त्रुटियों को फेंकने और पकड़ने के लिए कार्यों का एक अच्छा बैच है।
अंत में, यह उल्लेखनीय है कि हास्केल के पास अन्य भाषाओं की तरह अपवादों को संभालने का तंत्र है, सिवाय इसके कि अपवाद जीवन को पकड़ना है IO
। मुझे पता है कि कुछ लोग IO
भारी अनुप्रयोगों के लिए इनका उपयोग करना पसंद करते हैं, जहां सब कुछ संभावित रूप से विफल हो सकता है, लेकिन इतनी बार कि वे इसके बारे में सोचना पसंद नहीं करते हैं। चाहे आप इन अशुद्ध अपवादों का उपयोग करें या बस ExceptT Error IO
वास्तव में स्वाद की बात है। व्यक्तिगत रूप से मैं ExceptT
इसलिए चुनता हूं क्योंकि मुझे असफलता के अवसर की याद दिलाई जाती है।
सारांश के रूप में,
Maybe
- मैं एक स्पष्ट तरीके से विफल हो सकता हूं
Either CustomType
- मैं असफल हो सकता हूं, और मैं आपको बताऊंगा कि क्या हुआ
IO
+ अपवाद - मैं कभी-कभी असफल हो जाता हूं। यह देखने के लिए कि मैं क्या करता हूं, यह देखने के लिए मेरे डॉक्स जांचें
error
- मुझे आपसे बहुत ज्यादा नफरत है
head
याlast
प्रतीत होते हैंerror
, इसलिए मैं सोच रहा था कि क्या वास्तव में चीजें करने का एक अच्छा तरीका था और मैं बस कुछ याद कर रहा था। यह उस सवाल का जवाब देता है। :)