insertST :: StateDecoder -> SomeState -> Update SomeState SomeThing
insertST stDecoder st = ...
StateDecoder のものは使用できません
$(makeAcidic ''SomeState ['insertST])
しかし、状態を宣言してこのようにラップすると...
myDecoder :: StateDecoder
myDecoder = ...
insertSomeState :: SomeState -> Update SomeState SomeThing
insertSomeState st = insertST someDecoder
それからそれは動作します
私はこのパターンに従うデータ型をたくさん持っているので、それを解決するために TH を書いてみようと思いました。
mkWrappedAcid :: Name -> Name -> Q [Dec]
mkWrappedAcid decoder stname = do
insP@(FunD n _) <- insertMaker decoder stname
acidP <- mkAcidic stname [n]
return $[insP] ++ acidP
insertMaker :: Name -> Name -> Q [Dec]
insertMaker decoder stname = (funD istorename) [(clause [] (normalB insertStTH ) [] )
where
istorename = mkName.concat $ ["insert" , (nameBase stname)]
insertStTH = appE (varE 'insertST ) (varE decoder)
これはすべて美しく機能しますが、実行しようとすると...
$(mkWrappedAcid 'myDecoder ''SomeState)
私は...
`insertSomeState' is not in scope at a reify
テンプレート Haskell のステージングの問題と関係があることはわかっていますが、解決方法がわかりません。私がやればうまくいく
$(mkWrappedAcid 'myDecoder ''SomeState)
$(makeAcidic ''SomeState ['insertSomeState])
しかし、それは役に立ちません!