首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Acid-State的模板Haskell集成到您自己的模板haskell中

如何将Acid-State的模板Haskell集成到您自己的模板haskell中
EN

Stack Overflow用户
提问于 2013-01-30 00:07:01
回答 1查看 156关注 0票数 1

我正在编写一个模板haskell库供我自己使用,它可以生成函数。我想要做的是将这些生成的函数传递给acid-state的makeAcidic TH函数。

但是,在我的Q上下文中简单地传递生成的名称的结果会导致这个错误:

不在reify的范围内

如何将新创建的函数放入makeAcidic的作用域中?

我的代码:

代码语言:javascript
复制
gen_render :: Name -> Q [Dec]
gen_render typName =
  do (TyConI d) <- reify typName -- Get all the information on the type
     (type_name, vars, nars, constructors) <- typeInfo (return d) -- extract name and constructors
     x <- mapM func_def constructors
     let funcs = concat x
     let setterNames = [setter | (setter, _) <- funcs]
     acidic <- makeAcidic typName setterNames
     return $ [newFuncs | (_, newFuncs) <- funcs] ++ acidic

     where func_def data_con@(con_name, compontents) 
               = do 
                   x <- mapM genFieldSetandGet compontents
                   return $ concat x
           genFieldSetandGet (Just fieldName, fieldType) = do

                   uVar <- runQ $ varE $ mkName "u"

                   ixInsert <- appsE $ [[| IxSet.insert |], (varE $ mkName "u"), parensE $ appsE [(varE fieldName), (varE $ mkName "db")]]

                   {-instanceD (cxt [])
                     (conT (mkName "DatabaseAccess") `appT` (return fieldType) `appT` conT typName)-}

                   let setterName = (mkName $ "updateDb" ++ (capitalize $ nameBase fieldName))

                   func <- funD setterName $
                               [clause [(varP $ mkName "u"), (varP $ mkName "db")] (normalB $ 
                                   [| modify |] `appE` [| IxSet.insert |] `appE` (varE $ mkName "u") ) []]

                   return [(setterName, func)]
EN

回答 1

Stack Overflow用户

发布于 2013-01-30 03:45:40

您只需确保它们的拼接在makeAcidic拼接之前运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14587121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档