从模板Haskell拼接发出警告

从模板Haskell拼接发出警告,haskell,ghc,template-haskell,Haskell,Ghc,Template Haskell,我知道通过从拼接调用fail,可能会导致编译时错误,但是否可能只生成警告?特别是,我希望在使用-Werror编译时能够将此警告转化为错误 myFunc x | isSimpleCase x = 42 | otherwise = $todo 基本上我想做的是: todo :: Q Exp todo = do -- emit warning somehow loc <- location let message = ... -- generate

我知道通过从拼接调用
fail
,可能会导致编译时错误,但是否可能只生成警告?特别是,我希望在使用
-Werror
编译时能够将此警告转化为错误

myFunc x | isSimpleCase x = 42
         | otherwise = $todo
基本上我想做的是:

todo :: Q Exp
todo = do
    -- emit warning somehow

    loc <- location
    let message = ... -- generate message based on loc
    [| error $(litE (stringL message)) |]

我不相信这是可能的天真从TH,但这是一个非常酷的想法

实现它的一种方法是通过绑定到警告和/或函数

例如,假装是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函数
报告
。它的类型签名在文档中,但我必须阅读源代码才能弄清楚它的功能。TH文档肯定需要一些改进


无论如何,我的
todo
占位符现在工作得很好,如果有人感兴趣,我很快就会在Hackage上发布一些东西。

要从模板Haskell拼接发出警告, 您可以使用
reportWarning::String->Q()

它已经包含位置(行和列)。 您可以通过以下方式实现
todo
功能:

todo :: Q Exp
todo = do
  reportWarning "TODO"
  [| undefined |]
进一步资料 @哈马尔的回答表示函数
报告
。自GHC 7.6(2012年)以来,它已被弃用,并可能在不久的将来从API中删除。 (但是,
报告
仍然可用。) 和 截至2015年。)

使用
reportError
报告错误并继续
Q
计算 (无论如何,最终都无法编译)

使用
fail
以错误停止(GHC≤ 7.10). 那可能
.

GHC-API中的警告函数都需要访问GHC的已解析命令行标志,因此看起来相当复杂,但我找到了一个TH函数
报告
,它似乎满足了我的需要。