debugging - Haskell 支持调试吗?

标签 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

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

最佳答案

您可以使用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

(鉴于我正确解释了您想要的内容,并且 ifsthenselses 是符号,cond是条件,val1val2if-then-else<的值 表达式)。

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

关于debugging - Haskell 支持调试吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50527831/

相关文章:

functional-programming - 在 OCaml 中的每次递归调用中保留一个计数器

haskell - Haskell 中的函数缩减是如何工作的?

functional-programming - 编译错误 : "definitions with multiple clauses and default values require a function head"

swift - Snapchat LoginKit 导致 fatal error (Swift)

visual-studio-2010 - 当调试器关闭时如何捕获 Qt 应用程序的退出?

haskell - 如何在 Haskell 中表示时间间隔?

haskell - Curry编译器zinc无法配置

c++ - ubuntu下无法使用gdb进行调试

java - Android中修改APK的部分smali代码后如何定位注册问题?

haskell - 是什么导致了 "irrefutable pattern failed for pattern",它是什么意思?