6
我怎樣才能在每次調用例如打印列表或某事在Haskell:哈斯克爾調試
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
我怎樣才能在每次調用例如打印列表或某事在Haskell:哈斯克爾調試
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
預期。
與Daniel Fisher建議的一樣,但僅限於unsafePerformIO
。
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }
看看在similar question描述的是怎麼回事,當你使用unsafePerformIO
。
但它只適用於最後一次通話,如果我遞歸併進入警衛它只顯示最後一次通話如何顯示所有通話? – exilonX 2012-04-21 22:47:56
這將是非常令人驚訝的。除非你的跟蹤字符串是恆定的,並且你使用優化編譯,那麼這是正常的。對於上述情況,我會在每次調用中跟蹤輸出。 – 2012-04-21 22:52:00
對不起我的錯誤:) – exilonX 2012-04-21 22:54:20