案例中非穷举模式更好的例外

有没有办法让GHCi产生更好的exception信息,当它发现在运行时,一个调用产生的值不匹配函数的模式匹配?

它目前给出了产生非穷尽模式匹配的函数的行号,虽然有时候有时候需要一轮debugging,有时候我觉得是一遍又一遍地做同样的事情。 所以在我试图把解决scheme放在一起之前,我想看看是否还有别的东西存在。

除了给出行号之外,还有一个例外消息,表明它试图进行什么样的调用?

这甚至有可能吗?

尝试在ghci中打开警告。 例如,这可以通过传递-W来使用ghc编译时间警告。 你可以通过以下几种方式来完成

 ghci -fwarn-incomplete-patterns 

或者尼尔·米切尔(Neil Mitchell)描述了他如何在他的.ghci设置它 。 这里是相关的摘录:

 :set -fwarn-incomplete-patterns 

你也可以用ghci手动input,但每次启动时都会很痛苦。 以这种方式input,它只适用于在提示符处input的语句,而不是用于加载文件:l 。 相反,您可以将此注释放在要警告不完整模式的文件顶部:

 {-# OPTIONS_GHC -fwarn-incomplete-patterns #-} 

我认识到这是对你的问题的一个无法回答的问题,但我的印象是,在Haskell的资深程序员中间,普遍认为应该首先避免非详尽的模式,即使是在使用“ -Werror生成错误而不是仅仅警告。

我不确定它与GHCi的结合有多好,但是,特别是当你在提示符下编写函数,而不是加载文件时,我可以想象,它的作用不仅仅是帮助交互式工作。 尽pipe如此,使用合适的命令行标志运行GHCi似乎也能得到所需的结果。

如果您想要更详细的解决非穷尽的模式,您可以随时移植Catch以使用现代GHC版本。 嘿。

除此之外,如果你使用的是非穷举模式,因为函数确实不应该被某些值调用,那么可以用error $ "function foo called with ridiculous arguments " ++ show blahBlah来填充缺失的情况。 error $ "function foo called with ridiculous arguments " ++ show blahBlah ,如果知道无效的论据将是有益的。 或者,您可以尝试重写代码或定义更专用的数据types,以便函数总是可以对任何非底层参数进行合理的处理。

否则,我认为你是困难的debugging。