如何在模板haskell中使用getQ和putQ?

时间:2015-06-30 16:23:25

标签: haskell ghc template-haskell

我想使用Template Haskell处理Q monad中的状态。 根据一些堆栈溢出的答案,有一个使用unsafePerformIO的解决方案,但我想尽可能避免使用它。

我在模块Language.Haskell.TH.Syntax中找到了getQputQ。这些函数处理template-haskell 2.10文档所示的Q monad中的状态。 我尝试使用此API,但getQ无法获取状态。

以下代码是我的问题的一个例子。 我希望x(Just B)绑定,但x始终为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 []

结果,我得到了以下编译信息。

$ ghc -fforce-recomp Y.hs
[1 of 2] Compiling X                ( X.hs, X.o )
[2 of 2] Compiling Y                ( Y.hs, Y.o )
Nothing

如何使用getQputQ

1 个答案:

答案 0 :(得分:1)

目前getQ中存在一个错误:它最近已修复,应该在下一版GHC中运行。