क्या इसके लायक है के लिए, वहाँ वास्तव में इस मुद्दे पर यहाँ हैं "डिबगिंग" के दो प्रकार: इस तरह के मूल्य एक विशेष उपसूचक एक पुनरावर्ती समारोह में प्रत्येक कॉल पर है के रूप में
- लॉगिंग मध्यवर्ती मूल्यों,
- अभिव्यक्ति के मूल्यांकन के रनटाइम व्यवहार का निरीक्षण
सख्त अनिवार्य भाषा में ये आम तौर पर मेल खाते हैं। हास्केल में, वे अक्सर नहीं करते:
- रिकॉर्डिंग मध्यवर्ती मूल्य रनटाइम व्यवहार को बदल सकते हैं, जैसे कि अन्यथा छोड़े जाने वाले शब्दों के मूल्यांकन को मजबूर कर सकते हैं।
- आलस्य की वास्तविक प्रक्रिया आलस्य और साझा उप-अभिव्यक्तियों के कारण अभिव्यक्ति की स्पष्ट संरचना से नाटकीय रूप से भिन्न हो सकती है। बल्कि
IO
में सब कुछ उठाने की तुलना में, उदाहरण के लिए, एक साधारण Writer
इकाई पर्याप्त होगा, कार्य करने के लिए इस से किया जा रहा बराबर -
तुम सिर्फ मध्यवर्ती मूल्यों की एक लॉग रखने के लिए चाहते हैं, तो ऐसा करने के लिए कई तरीके हैं अपने वास्तविक परिणाम और एक संचयक मूल्य (कुछ प्रकार की सूची, आमतौर पर) के 2-टुपल को वापस करें।
यह भी नहीं आम तौर पर आवश्यक इकाई में सब कुछ डाल करने के लिए है, केवल कार्यों कि "लॉग ऑन" मूल्य पर लिखने की जरूरत है - उदाहरण के लिए, आप बस subexpressions कि लॉगिंग करने के लिए आवश्यकता हो सकती है बाहर कारक बन सकते हैं, मुख्य तर्क शुद्ध छोड़कर, फिर fmap
एस और व्हाट्नॉट के साथ सामान्य कार्यों में शुद्ध कार्यों और लॉगिंग कंप्यूटेशंस को जोड़कर समग्र गणना को फिर से इकट्ठा करें। ध्यान रखें कि Writer
एक मोनैड के लिए खेदजनक बहाना है: लॉग से पढ़ने के लिए कोई तरीका नहीं है, केवल इसे लिखें, प्रत्येक गणना तर्कसंगत रूप से इसके संदर्भ से स्वतंत्र है, जिससे चीजों को चारों ओर जोड़ना आसान हो जाता है।
लेकिन कुछ मामलों में भी यह अधिक है - कई शुद्ध कार्यों के लिए, केवल उप-अभिव्यक्तियों को अपरिवर्तित करने और आरईपीएल में चीजों को करने की कोशिश करना बहुत अच्छी तरह से काम करता है।
आप वास्तव में निरीक्षण शुद्ध कोड का रन-टाइम व्यवहार, तथापि करना चाहते हैं - उदाहरण के लिए, यह पता लगाने की क्यों एक उपसूचक diverges - वहाँ सामान्य में अन्य शुद्ध कोड से ऐसा करने के लिए कोई रास्ता नहीं है - वास्तव में, यह अनिवार्य रूप से परिभाषा शुद्धता है। तो उस स्थिति में, आपके पास शुद्ध भाषा "बाहरी" मौजूद उपकरण का उपयोग करने के अलावा कोई विकल्प नहीं है: या तो unsafePerformPrintfDebugging
--errr जैसे अशुद्ध कार्य, मेरा मतलब है trace
- या संशोधित रनटाइम पर्यावरण, जैसे कि जीएचसीआई डीबगर।
स्रोत
2010-08-23 14:49:38
यह ध्यान दिया जाना चाहिए कि 'ट्रेस' केवल डीबगिंग के लिए है, और यदि आप इसे "वास्तविक" तर्क के लिए उपयोग करते हैं तो इसे समुदाय द्वारा छोड़ा जाता है। – luqui