如何捕获此 TH 代码创建的声明

问题描述 投票:0回答:0

这是我的模板 Haskell 代码

objectGIDDeclaration :: String -\> Integer -\> Q \[Dec\]
objectGIDDeclaration dnameSTR gid = pure fDec
 where
   dname = dnameSTR \<\> "GID"
   fDec = \[fSig\]
   Sig = ValD fname objectType \[\]
   fname = VarP (mkName dname)
   objectType = NormalB (AppE constructor value)
   constructor = ConE (mkName "GID")
   value = LitE (IntegerL gid)

这就是它的作用

objectGIDDeclaration "foo" 3

这会创建一个声明

fooGID
GID {unGID = 3}

我还有一些其他模板 Haskell 代码

objectLabelDeclaration :: String -> Lexeme -> Q [Dec]
objectLabelDeclaration dnameSTR object = pure fDec
  where
    dname = dnameSTR <> "Label"
    fDec = [fSig, value]
    fSig = SigD fname objectType
    vPattern = VarP (mkName dname)
    value = ValD vPattern body []
    constructor = ConE (mkName "ObjectLabel")
    body = NormalB (AppE constructor lexeme)
    lexeme = UnboundVarE (mkName (show object))
    objectType = ConT (mkName "ObjectLabel")
    fname = mkName dname

这就是它的作用

objectLabelDeclaration "foo" CABINET

ghci> fooLabel 对象标签 {_unObjectLabel = CABINET}

这是我想做的,但不知道如何做

mapM someFunction ["foo","bar","baz"]

[(fooLabel,fooGID),(barLabel,barGID),(baz,bazGID)]

我刚刚尝试过这个

objectLabelDeclaration :: String -> Lexeme -> Q ([Dec],Name)

认为这就是我想要的

Name
。是吗?我应该想出另一种方法来捕捉
Name
吗?

欢迎提示技巧和建议

haskell template-haskell
© www.soinside.com 2019 - 2024. All rights reserved.