2015-06-30 3 views
6

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?

Antwort

1

Es gibt derzeit einen Fehler in getQ: Es wurde vor kurzem behoben und sollte in der nächsten Version von GHC funktionieren.

Verwandte Themen