我在haskell中有这段代码:
getMax :: [Integer] -> Integer
getMax dlis = foldr (\ next max_so_far ->
if (next > max_so_far)
then next
else max_so_far)
(head dlis) (tail dlis)
list = [1,2,3,4,5]
我在像getMax list
这样的ghci中运行它并返回5.我有点理解发生了什么,但我想让它打印它正在采取的每一步(被比较的数字)。我怎么能这样做?
修改后的程序:
getMax :: [Integer] -> Integer
getMax dlis = foldr (\ next max_so_far ->
if (traceThis next > traceThat max_so_far)
then next
else max_so_far)
(head dlis) (tail dlis)
traceThis :: (Show a) => a -> a
traceThis x = trace ("Comparing: " ++ show x) x
traceThat :: (Show a) => a -> a
traceThat x = trace (" with: " ++ show x) x
答案 0 :(得分:1)
这里有两种主要方法:
首先,您可以使用trace
功能。 (您需要先导入Debug.Trace
。)这需要打印一个字符串并返回一个值。它仅在(如果)值得到"使用时打印字符串" (哈斯克尔很懒,记得)。这有时会导致东西以非常奇怪的顺序打印。显然,这种方法需要实际更改代码,以便将其trace
调用。
其次,您可以使用GHCi调试器,如the GHC User Manual中所述。就个人而言,我从来没有那么多运气,但如果你想尝试它,那就是选择。并且它不需要更改任何代码。
可悲的是,没有按钮只是说"打印出你正在做的事情"。这将是非常有用的,并且是一个高度要求的功能,但似乎永远不会被创建...: - (
修改我发现您正在尝试做类似的事情:
if trace (show x) x > trace (show y) y then ...
问题是,未定义,trace
将首先执行。您可能想要做更像
if trace (show x ++ " > " ++ show y) (x > y) then ...