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