模板Haskell接头发出警告

| 我知道我可以通过从接合处调用
fail
来引起编译时错误,但是可能仅生成警告吗?我尤其希望在使用
-Werror
进行编译时,可以将此警告转换为错误。 本质上,我想做的是:
todo :: Q Exp
todo = do
    -- emit warning somehow

    loc <- location
    let message = ... -- generate message based on loc
    [| error $(litE (stringL message)) |]
这个想法是在编码时使用它而不是
undefined
,但是要确保它不会通过
-Werror
进行编译而潜入生产代码中。
myFunc x | isSimpleCase x = 42
         | otherwise = $todo
    
已邀请:
原来我所追求的功能是Template Haskell函数
report
。它的类型签名在文档中,但是我必须阅读源代码才能弄清楚它的作用。 TH文档肯定可以使用一些改进。 无论如何,我的
todo
占位符现在可以正常工作,并且如果有人感兴趣,我会尽快对Hackage进行介绍。     
我不认为TH会天真地做到这一点,但这是一个很酷的主意。 一种实现方法是通过绑定到GHC-API警告和调试输出或错误功能。 例如。假装是GHC,
import Panic
main = sorry \"help!\"
产生
$ ./A                                
A: A: sorry! (unimplemented feature or known bug)
  (GHC version 7.0.2 for x86_64-unknown-linux):
    help!
构造GHC警告应该类似,检查是否设置了
-Werror
,并且您可以清理API以便非常有用。     
要从模板Haskell接头发出警告, 您可以使用
reportWarning :: String -> Q ()
。 它已经包括位置(行和列)。 您可以通过以下方法简单地实现
todo
函数:
todo :: Q Exp
todo = do
  reportWarning \"TODO\"
  [| undefined |]
更多信息 @hammar的答案表示函数
report
。自GHC 7.6(2012)起不推荐使用,可能会在不久的将来从API中删除。 (但是,
report
仍然可用 在GHC 7.10 和 在GHC主分支 如2015年) 使用
reportError
报告错误并进行
Q
计算 (无论如何最终都会导致编译失败)。 使用ѭ0stop停止并出现错误(GHC≤7.10)。那可能 不GHC 8.0适用。     

要回复问题请先登录注册