无法在 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
的结果?
我认为您可以在 get
和 lucid
之间执行 IO 操作:
get "history" $ do
offers <- liftIO $ c >>= f
lucid $ mapM (mapM (p_ . toHtml) ) offers
与 liftIO
来自 Control.Monad.IO.Class
。
我在 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
的结果?
我认为您可以在 get
和 lucid
之间执行 IO 操作:
get "history" $ do
offers <- liftIO $ c >>= f
lucid $ mapM (mapM (p_ . toHtml) ) offers
与 liftIO
来自 Control.Monad.IO.Class
。