有没有办法让GHCi在运行时发现调用产生的值与函数的模式匹配不匹配时产生更好的异常消息?
它目前给出了产生非详尽模式匹配的函数的行号,虽然有时有用但需要进行一轮调试,有时我觉得一遍又一遍地做同样的事情。所以在我尝试整理解决方案之前,我想看看是否存在其他问题。
一条异常消息,除了提供行号外,还显示了它试图进行的呼叫类型?
这甚至可能吗?
答案 0 :(得分:12)
尝试在ghci中启用警告。例如,这可以通过传递-W
来启用ghc可以获得的编译时警告。您可以通过以下几种方式实现这一目标:
ghci -fwarn-incomplete-patterns
或Neil Mitchell describes how he sets this up in his .ghci
。以下是相关摘录:
:set -fwarn-incomplete-patterns
你也可以在ghci手动输入它,但每次启动它都会很痛苦。以这种方式输入,它仅适用于在提示符处输入的语句,而不适用于使用:l
加载文件。相反,您可以将此注释放在要警告不完整模式的文件的顶部:
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
答案 1 :(得分:2)
我认识到这对你的问题没有答案,但我的印象是,在资深的Haskell程序员中,人们普遍认为应该首先避免使用非详尽的模式,即使是使用它-Werror
生成错误而非警告。
我不确定它与GHCi的结合效果如何,特别是如果你在提示符下编写函数而不是加载文件 - 我可以想象它会妨碍工作交互。但是,使用适当的命令行标志运行GHCi似乎可以为我获得所需的结果。
如果您想要对非详尽模式有更激烈的解决方案,您可以随时移植Catch以使用现代GHC版本。嘿。
除此之外,如果你使用的是非详尽的模式,因为这个函数真的,真的,永远不应该用一些值来调用,如果知道无效的话,可以用error $ "function foo called with ridiculous arguments " ++ show blahBlah
之类的东西来填充缺失的案例。参数会有所帮助。或者,您可以尝试重新编写代码或定义更专业的数据类型,以便函数始终可以使用任何非底部参数做一些合理的事情。
否则,我认为你陷入了尴尬的调试。