首页 > 解决方案 > 无法在 Spock 和 Lucid 中创建的应用程序中显示 IO [[String]]

问题描述

我对 Haskell 中的 Spock、Lucid 和 IO 有疑问。我有一个功能

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

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

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

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

Wherec用于创建与 DB 的连接。但它不起作用。错误是:“没有因使用‘mapM’而产生的(可遍历 IO)实例”。

如果我尝试:

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

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

标签: haskelliohaskell-spockhaskell-lucid

解决方案


get我认为您可以在和之间执行 IO 操作lucid

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

liftIOControl.Monad.IO.Class. _


推荐阅读