在其他 Monad 中提取 IO 数据
Extraction IO data inside other Monad
我正在使用 HDBC-Sqlite3,我想根据我所在的页面进行查询。我想从 IO Monad 中获取数据。应该可以,因为"get"已经不纯了。 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
问题是我在 "do" 中,其中 Monad 是 ActionM 而不是 IO。
我考虑过从IO构造一个ActionM,然后使用x <- ... 语法,这是一个好的解决方案吗?
我也看到了liftIO/liftM的存在,但是我也没看懂how/when怎么用
我不熟悉那个特定的库,但通常会使用 liftIO
将 IO 操作注入另一个 monad。这确实是你在问题中暗示的。
我会尝试
get "/" $ do
x <- liftIO $ quickQuery' conn "SELECT * from definitions" []
blaze $ Mathskell.Views.Read.render conn
只要外部 monad 有一个 MonadIO
实例,这就应该有效。
我正在使用 HDBC-Sqlite3,我想根据我所在的页面进行查询。我想从 IO Monad 中获取数据。应该可以,因为"get"已经不纯了。 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
问题是我在 "do" 中,其中 Monad 是 ActionM 而不是 IO。
我考虑过从IO构造一个ActionM,然后使用x <- ... 语法,这是一个好的解决方案吗? 我也看到了liftIO/liftM的存在,但是我也没看懂how/when怎么用
我不熟悉那个特定的库,但通常会使用 liftIO
将 IO 操作注入另一个 monad。这确实是你在问题中暗示的。
我会尝试
get "/" $ do
x <- liftIO $ quickQuery' conn "SELECT * from definitions" []
blaze $ Mathskell.Views.Read.render conn
只要外部 monad 有一个 MonadIO
实例,这就应该有效。