作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 Template Haskell 处理 Q monad 中的状态。
根据一些堆栈溢出的答案,有一个使用 unsafePerformIO
的解决方案,但我想尽可能避免使用它。
我找到了getQ
和 putQ
在模块 Language.Haskell.TH.Syntax
.这些函数处理模板-haskell 2.10 文档所示的 Q monad 中的状态。
我尝试使用此 API,但 getQ
无法获得状态。
以下代码是我的问题的一个示例。
我期待 x
绑定(bind)到 (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
getQ
和
putQ
?
最佳答案
getQ 目前有一个错误:它最近已修复,应该可以在下一版本的 GHC 中工作。
关于haskell - 如何在模板haskell中使用getQ和putQ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31143506/
我是一名优秀的程序员,十分优秀!