Ich möchte mit Template Haskell Zustände in Q Monad behandeln. Nach einigen Antworten des Stack-Überlaufs gibt es eine Lösung, die unsafePerformIO
verwendet, aber ich möchte es so lange wie möglich vermeiden.Wie verwendet man getQ und putQ in Vorlage haskell?
Ich fand getQ
und putQ
in dem Modul Language.Haskell.TH.Syntax
. Diese Funktionen behandeln Zustände in Q-Monade, die im Template-Haskell 2.10-Dokument angezeigt werden. Ich habe versucht, diese API zu verwenden, aber getQ
schlägt fehl, Status zu erhalten.
Der folgende Code ist ein Beispiel für mein Problem. Ich erwarte, dass x
an (Just B)
gebunden ist, aber x
ist immer Nothing
.
-- X.hs
{-# LANGUAGE DeriveDataTypeable #-}
module X where
import Data.Typeable
data T = A | B | C deriving (Typeable,Show)
-- Y.hs
{-# LANGUAGE TemplateHaskell #-}
module Y where
import X
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
-- splice for testing getQ and putQ
do
putQ B
x <- getQ :: Q (Maybe T)
runIO $ print x -- prints Nothing
return []
als Ergebnis, ich habe folgende Kompilieren Nachricht.
$ ghc -fforce-recomp Y.hs
[1 of 2] Compiling X (X.hs, X.o)
[2 of 2] Compiling Y (Y.hs, Y.o)
Nothing
Wie getQ
und putQ
benutzen?