Haskell调试
如何在每次通话时在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
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) }