Tôi muốn xử lý các trạng thái theo đơn nguyên Q với Mẫu Haskell. Theo một số câu trả lời của ngăn xếp chồng, có một giải pháp sử dụng unsafePerformIO
, nhưng tôi muốn tránh sử dụng nó miễn là tôi có thể.Làm thế nào để sử dụng getQ và putQ trong mẫu haskell?
Tôi tìm thấy getQ
và putQ
trong mô-đun Language.Haskell.TH.Syntax
. Các hàm này xử lý các trạng thái trong Q monad được hiển thị theo tài liệu mẫu-haskell 2.10. Tôi đã cố gắng sử dụng API này, nhưng getQ
không nhận được trạng thái.
Mã sau là ví dụ về sự cố của tôi. Tôi hy vọng x
bị giới hạn ở (Just B)
, nhưng x
luôn là 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 []
kết quả là tôi nhận được thông báo biên dịch sau.
$ ghc -fforce-recomp Y.hs
[1 of 2] Compiling X (X.hs, X.o)
[2 of 2] Compiling Y (Y.hs, Y.o)
Nothing
Cách sử dụng getQ
và putQ
?