无法在 Spock 和 Lucid 中创建的应用程序中显示 IO [[String]]

Cannot display IO [[String]] in app created in Spock and Lucid

我在 Haskell 中遇到 Spock、Lucid 和 IO 的问题。我有一个函数

f :: MySQLConn -> IO [[String]]

f 的输出是语句“SELECT * FROM TABLE”的结果,其中 [MySQLValue] 列表已转换为 [String] 列表。

然后我想在 Spock 中使用函数 f 来在我的应用程序中显示输出。我尝试使用类似的东西:

(...)
 get "history" $ lucid $ do 
        let offers = c >>= f
        mapM (mapM (p_ . toHtml) ) offers
(...)

其中c用于创建与DB的连接。 但它不起作用。一个错误是:“没有因使用‘mapM’而产生的(Traversable IO)实例”。

如果我尝试:

 get "history" $ lucid $ do 
        mapM (mapM (p_ . toHtml) ) [["a", "b"], ["1","x"]]

是正确的。所以我的问题是 - 如何在此应用程序中使用 f 的结果?

我认为您可以在 getlucid 之间执行 IO 操作:

 get "history" $ do
        offers <- liftIO $ c >>= f
        lucid $ mapM (mapM (p_ . toHtml) ) offers

liftIO 来自 Control.Monad.IO.Class