2017-06-03 97 views
0

我正在使用HDBC-Sqlite3,我想根據頁面進行查詢。我想從IO Monad中獲取數據。這應該是可能的,因爲「get」已經不是純粹的。一般來說,Haskell是如何完成的?提取其他Monad中的IO數據

main = do 
    conn <- connectSqlite3 "test.db" 
    scotty 3000 $ do 
    get "/" $ do 
     x <- quickQuery' conn "SELECT * from definitions" [] -- Here, how to do it? 
     blaze $ Mathskell.Views.Read.render conn 

問題是,我在一個「做」,其中Monad是ActionM而不是IO。

我想過從IO構建一個ActionM,然後使用x語言,這是一個很好的解決方案嗎? 我也看到了liftIO/liftM的存在,但我不知道如何/何時使用它。

回答

2

我對那個特定的庫不熟悉,但通常會將一個IO操作注入到另一個單元中,並使用liftIO。這確實是你在你的問題中暗示的。

我會嘗試像

get "/" $ do 
    x <- liftIO $ quickQuery' conn "SELECT * from definitions" [] 
    blaze $ Mathskell.Views.Read.render conn 

這應該工作,只要外單子有MonadIO實例。

+0

謝謝,它的工作原理。但奇怪的是,它需要一個「;」在「x < - ...」行末尾,否則他認爲它只是一個語句,最後一個語句需要是一個表達式。任何暗示爲什麼?我認爲這是因爲創建的遊牧民族可以採取更多的論據 – x4rkz

+1

@ x4rkz分號只有在你有錯誤的縮進時纔有幫助。檢查'do'塊中的每個條目是否縮進相同的級別。例如,如果我縮進'放大$ ...'',那將成爲前一個條目的一部分,這會觸發你提到的錯誤。 – chi

+0

我已經這樣做了,刪除了縮進,並確保我放了相同的。 – x4rkz