首页 > 解决方案 > Haskell 支持调试吗?

问题描述

例如这是一个函数:

iffthen :: [String] -> Parser String
iffthen a = do 
x <- symbol (head a)
               y <- booleana (head (tail a))
               z <- symbol (head (tail (tail a)))
               k <- assignP (head (tail (tail (tail a))))
               l <- symbol (head (tail (tail (tail (tail a)))))
               m <- assignP (head (tail (tail (tail (tail (tail a))))))
               return k

我需要看看每条指令的真正作用

标签: debugginghaskellfunctional-programming

解决方案


您可以使用 的trace :: String -> a -> aDebug.Trace相关功能,如traceShowId :: Show a => a -> a。这个函数基本上打印附加的String参数以防函数被评估,并返回函数的结果。

因此,对于某些可以打印的内容,我们可以附加此类trace功能,从而打印信息。请注意,Haskell 中的调试通常与命令式语言中的调试不同,主要是由于懒惰:通常不评估函数,除非我们需要结果。所以这意味着某些函数永远不会被评估,或者这些函数在我们构建该函数很久之后才被评估。

邻接您的功能,我建议在这里使用模式匹配,并消除未使用变量的噪音:

iffthen :: [String] -> Parser String
iffthen (ifs : cond : thens : val1 : elses : val2 : _) = do 
    symbol ifs
    booleana cond
    symbol thens
    k <- assignP val1
    symbol elses
    assignP val2
    return k

(鉴于我正确地解释了您想要的内容,并且ifs, thens,elses是符号,cond是条件,并且val1val2- - 表达式的ifthenelse

最好不要使用列表(因为在编译时不能保证元素的数量),从而构造一个带有特定参数的单独类型。


推荐阅读