Haskell支持调试吗?

Ric*_*isi 2 debugging haskell functional-programming

例如,这是一个功能:

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
Run Code Online (Sandbox Code Playgroud)

我需要看看每个指令到底做了什么

Wil*_*sem 8

您可以使用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
Run Code Online (Sandbox Code Playgroud)

(由于我理解你想要什么correnctly,并且ifs,thens,elses是符号,cond是条件,以及val1val2是的值if- then- else表达).

最好不要使用列表(因为在编译时保证元素的数量),因此构造具有特定参数的sperate类型.