首页 文章

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

提问于
浏览
5

有没有办法让GHCi在运行时发现调用产生的值与函数的模式匹配不匹配时产生更好的异常消息?

它目前给出了产生非详尽模式匹配的函数的行号,虽然有时有用但需要一轮调试,有时我觉得一遍又一遍地做同样的事情 . 所以在我尝试整理解决方案之前,我想看看是否存在其他问题 .

除了提供行号之外的异常消息还显示了它试图进行的呼叫类型?

这甚至可能吗?

2 回答

  • 2

    尝试打开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 #-}
    
  • 11

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

    我不确定它与GHCi的组合效果如何,特别是如果你在提示符下编写函数而不是加载文件 - 我可以想象它会妨碍交互式工作 . 但是,使用适当的命令行标志运行GHCi似乎可以获得所需的结果 .

    如果您想要对非详尽模式有更激烈的解决方案,您可以随时将Catch移植到现代GHC版本中 . 嘿 .

    除此之外,如果你使用的是非详尽的模式,因为函数真的,真的,永远不应该使用某些值调用,如果知道无效的参数会有所帮助,那么缺少的情况可以用 error $ "function foo called with ridiculous arguments " ++ show blahBlah 来填充 . 或者,您可以尝试重新编写代码或定义更专业的数据类型,以便函数始终可以使用任何非底部参数执行合理的操作 .

    否则,我认为你陷入了尴尬的调试 .

相关问题