我正在使用 HDBC-Sqlite3,我想根据我所在的页面进行查询。我想从 IO Monad 中获取数据。应该可以,因为“得”已经不纯了。通常在 Haskell 中是如何完成的?
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 的存在,但我也不明白如何/何时使用它。
最佳答案
我不熟悉那个特定的库,但通常会使用 liftIO
将 IO 操作注入(inject)到另一个 monad 中。这确实是您在问题中暗示的内容。
我会尝试类似的东西
get "/" $ do
x <- liftIO $ quickQuery' conn "SELECT * from definitions" []
blaze $ Mathskell.Views.Read.render conn
只要外部 monad 有一个 MonadIO
实例,这就应该有效。
关于ios - 在其他 Monad 中提取 IO 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44349534/