2012-04-21 15 views
6

मैं कैसे उदाहरण के लिए हर कॉल पर हास्केल में एक सूची या कुछ और मुद्रित कर सकते हैं:हास्केल डिबगिंग

funct a list = funct (a + 1) (a : list) 
       print list here ??????? but how ? 

उत्तर

11

डिबगिंग के लिए, वहाँ है

import Debug.Trace 

funct :: Integer -> [Integer] -> Bool 
funct a list = trace (show list) $ funct (a + 1) (a : list) 

जहां trace :: String -> a -> a। यह हुड के तहत unsafePerformIO का उपयोग करता है, इसलिए यह खराब है और केवल डिबगिंग के लिए है।

ध्यान रखें कि आलसी मूल्यांकन के कारण, डिबगिंग आउटपुट आश्चर्यजनक क्रम में दिखाई दे सकता है और प्रोग्राम सामान्य रूप से उत्पन्न होने वाले आउटपुट के साथ अंतःस्थापित हो सकता है।

साथ

module TraceIt where 

import Debug.Trace 

funct :: Integer -> [Integer] -> Bool 
funct 10 list = null list 
funct a list = trace (show list) $ funct (a + 1) (a : list) 

मैं

*TraceIt> funct 1 [] 
[] 
[1] 
[2,1] 
[3,2,1] 
[4,3,2,1] 
[5,4,3,2,1] 
[6,5,4,3,2,1] 
[7,6,5,4,3,2,1] 
[8,7,6,5,4,3,2,1] 
False 

अपेक्षा के अनुरूप मिलता है।

+0

लेकिन यह केवल अंतिम कॉल के लिए काम करता है, अगर मैं बार-बार जाता हूं और यह गार्ड में प्रवेश करता है तो यह केवल अंतिम कॉल दिखाता है कि मैं सभी कॉल कैसे दिखा सकता हूं ??? – exilonX

+0

यह बहुत ही आश्चर्यजनक होगा। जब तक आपकी ट्रेसिंग स्ट्रिंग स्थिर न हो और आप ऑप्टिमाइज़ेशन के साथ संकलित न हों, तो यह सामान्य है। उपरोक्त के लिए, मुझे हर कॉल में ट्रेसिंग आउटपुट मिलता है। –

+0

मेरी गलती क्षमा करें :) – exilonX

1

जैसा कि डैनियल फिशर ने सुझाव दिया था, लेकिन केवल unsafePerformIO के साथ ही।

> import System.IO.Unsafe 
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) } 

पर similar question का वर्णन करता है क्या वास्तव में जब आप unsafePerformIO का उपयोग हो रहा है एक नजर डालें।