在其他 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 实例,这就应该有效。