Haskell调试

Haskell调试,haskell,functional-programming,Haskell,Functional Programming,如何在每次通话时在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 : l

如何在每次通话时在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
,因此它是邪恶的,只用于调试

请注意,由于延迟计算,调试输出可能以令人惊讶的顺序出现,并与程序通常生成的输出交错

我明白了


与预期一样。

与Daniel Fisher建议的相同,但仅使用
unsafePerformIO

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

看一看描述了当您使用
unsafePerformIO

时实际发生的情况,但它只适用于最后一个调用,如果我递归地去,它进入一个保护,它只显示最后一个调用如何显示所有调用???这将非常令人惊讶。除非您的跟踪字符串是常量,并且您使用优化进行编译,否则这是正常的。对于以上内容,我在每次调用中都会得到跟踪输出。啊,谢谢,忘了这一点。它太新了,我的长期记忆都记不住了。
*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
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }