这是我的模板 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
吗?
欢迎提示技巧和建议