1

関数を生成する自分用のテンプレート Haskell ライブラリを作成しています。私がやりたいことは、これらの生成された関数を酸状態の makeAcidic TH 関数に渡すことです。

ただし、Q コンテキストで生成された名前を単純に渡すと、次のエラーが発生します。

reify では範囲外です

makeAcidic が機能するために、新しく作成した関数をスコープに入れるにはどうすればよいですか?

私のコード:

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)]
4

1 に答える 1

0

makeAcidic スプライスの前にそれらのスプライスが実行されるようにする必要があります。

于 2013-01-29T19:45:39.527 に答える