在其他Monad中提取IO数据

时间:2017-06-03 23:47:31

标签: ios haskell monads

我正在使用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

问题是我在&#34;做&#34; Monad是ActionM而不是IO。

我考虑过从IO构建ActionM,然后使用x&lt; - ...语法,这是一个很好的解决方案吗? 我也看到了liftIO / liftM的存在,但我也不知道如何/何时使用它。

1 个答案:

答案 0 :(得分:2)

我不熟悉那个特定的库,但通常会将一个IO动作注入到liftIO的另一个monad中。这确实是你在问题中提示的。

我会尝试像

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

只要外部monad具有MonadIO实例,这就应该有效。