debugging - 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
我需要看看每条指令的真正作用
解决方案
您可以使用 的trace :: String -> a -> a
或Debug.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
是条件,并且val1
是val2
- - 表达式的if
值then
)else
。
最好不要使用列表(因为在编译时不能保证元素的数量),从而构造一个带有特定参数的单独类型。
推荐阅读
- google-apps-script - Google Scripts Chart 语法以及如何为烛台图着色
- hive - Spark shell 和 spark 数据框为 parquet 文件提供不同的结果
- reactjs - 在 React Modal 中使用正确的数据设置状态
- swift - 从 Indexpath 获取 collectionView 的 HeaderView 参考
- vb.net - 向客户端 PC 部署 vb.net 和水晶报告
- algorithm - 如何在有向图中找到第一个节点和所有其他节点之间所有可能路径的计数?
- python - 稀疏矩阵 hstack 得到关于可下标性的错误
- nativescript - nativescript相机中的自定义布局以及android上的自定义布局根本不可见
- sql - SQL Server:从第一行减去最后一行
- javascript - 当触发孩子在javascript中未定义的点击事件时