例如,这是一个函数:
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
我需要看看每条指令到底做了什么
最佳答案
您可以使用trace :: String -> a -> a
Debug.Trace
或相关函数,如 traceShowId :: Show a => a -> a
。该函数基本上会在函数被求值时打印附加的String
参数,并返回函数的结果。
因此,对于某些可以打印的内容,我们可以附加这样的trace
函数,从而打印信息。请注意,Haskell 中的调试通常与命令式语言中的调试不同,主要是由于惰性:通常不会评估函数,除非我们需要结果。因此,这意味着某些函数永远不会被求值,或者这些函数在我们构造该函数很久之后才会被求值。
关于你的函数,我建议在这里使用模式匹配,并消除未使用变量的噪音:
iffthen :: [String] -> Parser String
iffthen <b>(ifs : cond : thens : val1 : elses : val2 : _)</b> = do
symbol <b>ifs</b>
booleana <b>cond</b>
symbol <b>thens</b>
k <- assignP <b>val1</b>
symbol <b>elses</b>
assignP <b>val2</b>
return k
(鉴于我正确解释了您想要的内容,并且 ifs
、thens
、elses
是符号,cond
是条件,val1
和val2
是if
-then
-else<的值
表达式)。
最好不要使用列表(因为在编译时无法保证元素数量),从而构造具有特定参数的单独类型。
关于debugging - Haskell 支持调试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50527831/