案例中非穷举模式更好的例外
有没有办法让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。