2009-04-28 11 views
14

क्या हैकेल में कमी चरणों को देखने का कोई तरीका है, यानी रिकर्सिव फ़ंक्शन कॉल का पता लगाया गया है? उदाहरण के लिए, चेज़ योजना हमें ट्रेस-लैम्ब्डा प्रदान करती है। क्या हास्केल में समकक्ष रूप है?हास्केल में कमी चरण देखें

+0

योजना के साथ एक बड़ा अंतर है; हास्केल आलसी है इसलिए कॉल के बाद वास्तविक मूल्यांकन हो सकता है। – bortzmeyer

उत्तर

7

आप उन स्थानों पर Debug.Trace.trace डालने का प्रयास कर सकते हैं, जहां आप ट्रेस करना चाहते हैं, लेकिन इसमें (ए) जंगली रूप से बाहर आउटपुट आउटपुट का उत्पादन करने की प्रवृत्ति है, क्योंकि आपका ट्रेस स्टेटमेंट उस थंक से संबंधित हो सकता है जिसका मूल्यांकन अभी तक नहीं किया जाता है मूल कॉल से बहुत दूर, और (बी) आपके प्रोग्राम के रनटाइम व्यवहार को बदलना, अगर ट्रेसिंग को उन चीजों का मूल्यांकन करने की आवश्यकता है जो अन्यथा मूल्यांकन नहीं किए गए हैं (अभी तक)।

क्या यह डिबगिंग के लिए है?


Hat उत्पादन ट्रेसिंग जो चलाने के बाद देखी जा सकती है करने के लिए अपने स्रोत कोड को संशोधित करता है यदि ऐसा है तो ...। उत्पादन बहुत आप क्या चाहते हैं के करीब होना चाहिए: अपने मुखपृष्ठ पर उदाहरण

उदाहरण के लिए

, दोषपूर्ण कार्यक्रम

main = let xs :: [Int] 
      xs = [4*2,5 `div` 0,5+6] 
     in print (head xs,last' xs) 

last' (x:xs) = last' xs 
last' [x] = x 

की गणना है परिणाम देता है

(8, No match in pattern. 

और हैट देखने के उपकरण का उपयोग इसके व्यवहार का पता लगाने के लिए किया जा सकता है:

  • हैट-ढेर

गर्भपात संगणना के लिए, कि संगणना कि एक त्रुटि संदेश के साथ समाप्त या बाधित कर रहे थे, हैट-ढेर, जिसमें से काम फोन गणना निरस्त कर दिया गया पता चलता है। यह फ़ंक्शन कॉल (रेडएक्स) का वर्चुअल स्टैक दिखाकर ऐसा करता है। इस प्रकार, स्टैक पर दिखाए गए प्रत्येक फ़ंक्शन कॉल के ऊपर फ़ंक्शन कॉल का कारण बनता है। शीर्ष ढेर तत्व के मूल्यांकन ने त्रुटि उत्पन्न की (या इसके मूल्यांकन के दौरान गणना में बाधा डाली गई थी)। दिखाया गया ढेर वर्चुअल है, क्योंकि यह वास्तविक रनटाइम स्टैक के अनुरूप नहीं है। वास्तविक रनटाइम स्टैक आलसी मूल्यांकन सक्षम करता है जबकि वर्चुअल स्टैक एक स्टैक से मेल खाता है जिसका उपयोग उत्सुक (सख्त) मूल्यांकन के लिए किया जाएगा।

उपर दिए गए उदाहरण के कार्यक्रम का उपयोग करना, हैट-ढेर,

$ hat-stack Example 
Program terminated with error: 
     No match in pattern. 
Virtual stack trace: 
(Last.hs:6)  last' [] 
(Last.hs:6)  last' [_] 
(Last.hs:6)  last' [_,_] 
(Last.hs:4)  last' [8,_,_] 
(unknown)  main 
$ 

इन दिनों चलता GHCi (≥ 6.8.1) भी एक डिबगर के साथ आता है:

$ ghci -fbreak-on-exception 
GHCi, version 6.10.1: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> :l Example.hs 
[1 of 1] Compiling Main    (Example.hs, interpreted) 

Example.hs:5:0: 
    Warning: Pattern match(es) are overlapped 
      In the definition of `last'': last' [x] = ... 
Ok, modules loaded: Main. 
*Main> :trace main 
(8,Stopped at <exception thrown> 
_exception :: e = _ 
[<exception thrown>] *Main> :back 
Logged breakpoint at Example.hs:(5,0)-(6,12) 
_result :: t 
[-1: Example.hs:(5,0)-(6,12)] *Main> :hist 
-1 : last' (Example.hs:(5,0)-(6,12)) 
-2 : last' (Example.hs:5:15-22) 
-3 : last' (Example.hs:(5,0)-(6,12)) 
-4 : last' (Example.hs:5:15-22) 
-5 : last' (Example.hs:(5,0)-(6,12)) 
-6 : last' (Example.hs:5:15-22) 
-7 : last' (Example.hs:(5,0)-(6,12)) 
-8 : main (Example.hs:3:25-32) 
-9 : main (Example.hs:2:17-19) 
-10 : main (Example.hs:2:16-34) 
-11 : main (Example.hs:3:17-23) 
-12 : main (Example.hs:3:10-33) 
<end of history> 
[-1: Example.hs:(5,0)-(6,12)] *Main> :force _result 
*** Exception: Example.hs:(5,0)-(6,12): Non-exhaustive patterns in function last' 

[-1: Example.hs:(5,0)-(6,12)] *Main> :back 
Logged breakpoint at Example.hs:5:15-22 
_result :: t 
xs :: [t] 
[-2: Example.hs:5:15-22] *Main> :force xs 
xs = [] 

हालांकि उतना अच्छा नहीं है, लेकिन इसका आसानी से उपलब्ध होने का लाभ है, और आपके कोड को पुन: संकलित किए बिना प्रयोग योग्य है।

0

गले में कमी की कमी है, अगर इससे मदद मिलती है? वैकल्पिक रूप से, क्या आप प्रत्येक कोड पर क्या कर रहे हैं, इसके बारे में अधिक जानकारी प्राप्त करने के लिए, अपने कोड को लपेटने के लिए गले हुड जैसे कुछ का उपयोग कर सकते हैं?

0

हास्केल मानक में कोई भी प्रकार का निर्माण नहीं किया गया है।

मुझे उम्मीद है कि Helium ग्राफिकल दुभाषिया इस तरह कुछ प्रदान करेगा, लेकिन वेब पेज इस विषय पर चुप है।

0

डेटा संरचनाओं को देखने के लिए vacuum का आंशिक समाधान उपयोग करना है।

मैंने फोल्ड, स्कैन और अन्य के कुछ gif एनिमेशन देखा है, लेकिन मैं उन्हें इस समय नहीं ढूंढ सकता। मुझे लगता है कि काले गिब्बार्ड ने एनिमेशन बनाया।

संबंधित मुद्दे