Exception 更好的非穷举模式例外情况

Exception 更好的非穷举模式例外情况,exception,exception-handling,haskell,Exception,Exception Handling,Haskell,当GHCi在运行时发现调用生成的值与函数的模式匹配不匹配时,是否有办法让它生成更好的异常消息 它目前给出了生成非穷举模式匹配的函数的行号,虽然有时很有用,但确实需要一轮调试,有时我觉得这是在一遍又一遍地做同样的事情。所以,在我试图提出一个解决方案之前,我想看看是否存在其他问题 一条异常消息,除了给出行号外,还显示它试图拨打什么类型的电话 这可能吗?尝试打开ghci中的警告。例如,通过传递-W,可以使用ghc获得编译时警告。您可以通过以下几种方式执行此操作: ghci -fwarn-incompl

当GHCi在运行时发现调用生成的值与函数的模式匹配不匹配时,是否有办法让它生成更好的异常消息

它目前给出了生成非穷举模式匹配的函数的行号,虽然有时很有用,但确实需要一轮调试,有时我觉得这是在一遍又一遍地做同样的事情。所以,在我试图提出一个解决方案之前,我想看看是否存在其他问题

一条异常消息,除了给出行号外,还显示它试图拨打什么类型的电话


这可能吗?

尝试打开ghci中的警告。例如,通过传递
-W
,可以使用ghc获得编译时警告。您可以通过以下几种方式执行此操作:

ghci -fwarn-incomplete-patterns
或者。以下是相关摘录:

:set -fwarn-incomplete-patterns
您也可以在ghci手动输入,但每次启动时都要这样做会很痛苦。以这种方式输入,它仅适用于在提示下输入的语句,不适用于加载带有
:l
的文件。相反,您可以将此注释放在要警告不完整模式的文件顶部:

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

我知道这不是对你问题的回答,但我的印象是,在经验丰富的Haskell程序员中,人们普遍认为应该首先避免使用非穷举模式,甚至使用
-Werror
来生成错误,而不仅仅是警告

但是,我不确定它与GHCi的结合效果如何,特别是当您在提示符下编写函数而不是加载文件时——我可以想象,它不仅对交互工作有帮助,而且会带来更多的阻碍。不过,使用适当的命令行标志运行GHCi似乎可以得到我想要的结果

如果您想要一个针对非穷举模式的更彻底的解决方案,您可以随时移植到现代GHC版本。呵呵

除此之外,如果您使用的是非穷举模式,因为函数确实不应该使用某些值调用,那么如果知道无效的参数会有所帮助,那么缺少的情况可以用类似于
error$“function foo called with荒谬的参数”++show blahBlah
的内容来填充。或者,您可以尝试重新编写代码或定义更专门的数据类型,这样函数就可以始终对任何非底部参数执行合理的操作


否则,我认为您将陷入尴尬的调试中。

遗憾的是,就我所知,这并不总是警告您。。。我刚试过,运气不好,谢谢你!显然,这只适用于在ghc中键入的语句,而不是从文件中加载的语句。我也更新了我的答案来解决这个问题。值得一提的是,当我尝试使用它时,直接使用实际的命令行选项调用GHCi似乎可以为加载的文件和在提示符处键入的语句启用它。这是一个很好的观点,目前我怀疑自己是否能遵守这条规则,但我很快就要参加一个重构会议,所以打开它并修复出现的所有问题很快就会出现在列表上。谢谢你的提示,我不知道你能用这种方式构造一个错误。我很遗憾得到了一些有用的错误,因为我还没有看到这种风格被使用。除了沿着错误“函数foo处弃船”的方向抛出错误外:
error
只是一个函数,它使用任意
字符串作为错误消息;您可以执行任何创建字符串的操作。如果还没有,您可能还想查看
Debug.Trace
模块,以了解老式“printf调试”的快速而肮脏的Haskell版本。就使用
error
而言,对于生产代码来说,这可能是一种不好的风格,但对于开发/测试来说,这是很好的。谢谢,值得研究:)。我一直在琢磨怎么做。。。