如何打印此代码所经历的所有步骤?

时间:2015-10-28 14:44:31

标签: haskell

我在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

1 个答案:

答案 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 ...