在我们的项目中,我们有很多 TH 生成的函数。向它们添加通用注释是有意义的,以便它们在 Haddock/Hoogle 中可见。至少,类似“这是由 TH 生成的”。这样的事可能吗?
如果有的话那就太好了,但目前在 GHC 中还不可能。
是的。
这是一个基本示例,它声明某个函数的副本,在其名称前面添加
hello_
,并在其文档前面添加 Hello !
。
{-# LANGUAGE TemplateHaskell #-}
module MyTH where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
helloCopy :: Name -> Q [Dec]
helloCopy name = do
doc <- getDoc (DeclDoc name)
let helloName = mkName ("hello_" ++ nameBase name)
let helloDoc = case doc of
Nothing -> "Hello !"
Just old -> "Hello !" ++ old
addModFinalizer $ putDoc (DeclDoc helloName) helloDoc
[d| $(varP helloName)= $(varE name) |]
module MyModule where
import MyTH
-- | Interesting stuff about blub
blub :: Int
blub = 4
$(helloCopy 'blub)
现在如果你运行
haddock
,你会得到以下文档,你会找到 hello_blub
的文档,上面写着“你好!关于 blub 的有趣的东西”