मैं कैसे उदाहरण के लिए हर कॉल पर हास्केल में एक सूची या कुछ और मुद्रित कर सकते हैं:हास्केल डिबगिंग
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
मैं कैसे उदाहरण के लिए हर कॉल पर हास्केल में एक सूची या कुछ और मुद्रित कर सकते हैं:हास्केल डिबगिंग
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
डिबगिंग के लिए, वहाँ है
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
अपेक्षा के अनुरूप मिलता है।
जैसा कि डैनियल फिशर ने सुझाव दिया था, लेकिन केवल unsafePerformIO
के साथ ही।
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }
पर similar question का वर्णन करता है क्या वास्तव में जब आप unsafePerformIO
का उपयोग हो रहा है एक नजर डालें।
लेकिन यह केवल अंतिम कॉल के लिए काम करता है, अगर मैं बार-बार जाता हूं और यह गार्ड में प्रवेश करता है तो यह केवल अंतिम कॉल दिखाता है कि मैं सभी कॉल कैसे दिखा सकता हूं ??? – exilonX
यह बहुत ही आश्चर्यजनक होगा। जब तक आपकी ट्रेसिंग स्ट्रिंग स्थिर न हो और आप ऑप्टिमाइज़ेशन के साथ संकलित न हों, तो यह सामान्य है। उपरोक्त के लिए, मुझे हर कॉल में ट्रेसिंग आउटपुट मिलता है। –
मेरी गलती क्षमा करें :) – exilonX