2015-06-30 23 views
6

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 getQputQ 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 getQputQ?

Trả lời

1

Hiện tại có lỗi trong getQ: gần đây đã được khắc phục và sẽ hoạt động trong phiên bản tiếp theo của GHC.

Các vấn đề liên quan