2010-04-29 47 views
3

有没有办法让GHCi产生更好的异常消息,当它在运行时发现一个调用产生了与函数的模式匹配不匹配的值?更好的例外情况下,非穷举模式

它目前给出了产生非穷举模式匹配的函数的行号,虽然有时需要进行一轮调试,但有时我觉得它们会一遍又一遍地做同样的事情。所以在我尝试整理一个解决方案之前,我想看看是否还有别的东西存在。

一个异常消息,除了给出行号外,还显示它试图创建什么样的调用?

这甚至可能吗?

回答

9

尝试打开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

可悲的是,这并不总是警告,据我所知...我只是试过了,没有运气,谢谢反正! – toofarsideways 2010-04-29 13:49:01

+1

显然这只适用于在ghc中键入的语句,而不是从文件加载。我更新了我的答案,也为此工作。 – 2010-04-29 15:41:58

+0

谢谢,正是我需要的! – toofarsideways 2010-04-29 16:33:49

2

我认识到这是一个不回答你的问题的东西,但我的印象是老将哈斯克尔间程序员普遍认为,首先应该避免使用非穷举模式,即使使用-Werror来生成错误而不仅仅是警告。

但是我不确定GHCi和GHCi的结合程度如何,特别是如果你在提示符下编写函数而不是加载文件时 - 我可以想象它的方法不仅仅是帮助互动工作。尽管如此,使用适当的命令行标志运行GHCi对我来说似乎也能得到理想的结果。

如果您想对非穷举模式采取更激烈的解决方案,您可以随时使用Catch以使用现代GHC版本。嘿。

除此之外,如果您使用的是非穷举模式,因为函数确实不应该使用某些值调用,那么可以使用类似error $ "function foo called with ridiculous arguments " ++ show blahBlah的方式填充丢失的例子,如果知道无效参数是很有帮助。或者,您可以尝试重写您的代码或定义更专用的数据类型,以便函数始终可以对任何非底层参数进行合理处理。

否则,我认为你会陷入尴尬的调试。

+0

这是一个很好的观点,因为目前我怀疑我可以遵循这个规则,但是我很快就要进行一次重构会议,所以将这个问题转化并修复出现的所有问题很快就会出现在这个列表中。感谢你的演出提示,我不知道你可以用这种方式构造一个错误。我很痛惜有一些有用的错误,因为我没有看到使用这种风格。除了在错误的方向上抛出错误“在foo函数中抛弃” – toofarsideways 2010-04-29 16:37:37

+0

@toofarsideways:'error'只是一个函数,它为错误信息提供了一个任意的'String';你可以做任何你想要创建的字符串。如果您还没有,可能还想查看'Debug.Trace'模块,以获得旧式“printf调试”的快速和肮脏的Haskell版本。就使用'error'而言,它可能是生产代码的不良风格,但对于开发/测试来说很好。 – 2010-04-29 16:55:07

+0

谢谢,值得一看:)。我一直在挠头如何做到这一点...... – toofarsideways 2010-04-29 17:36:35