在fpcomplete.com上,我正在阅读使用yesod表单的教程:https://www.fpcomplete.com/school/advanced-haskell/building-a-file-hosting-service-in-yesod/part%202?show=tutorials。根据教程,我的主要功能是
main = do
titems <- atomically $ newTVar []
liftIO $ warpEnv (Links titems)
我想要做的是在内存中启动一个Sql数据库,然后将表单中的所有数据都放在内存中。但即使是一个非常简单的例子也不起作用:
main = runSqlite ":memory:" $ do
-- runMigration migrateAll
-- michaelId <- insert $ Person "Michael" $ Just 26
-- michael <- get michaelId
-- liftIO $ print michael
titems <- atomically $ newTVar []
liftIO $ warpEnv (Links titems)
我得到的错误是
src/Main.hs@39:13-39:36Couldn't match expected type `SqlPersistT
(Control.Monad.Logger.NoLoggingT
(Control.Monad.Trans.Resource.ResourceT m0))
t0'
with actual type `IO (TVar [a0])'
In a stmt of a 'do' block: titems <- atomically $ newTVar []
In the second argument of `($)', namely
`do { titems <- atomically $ newTVar [];
liftIO $ warpEnv (Links titems) }'
In the expression:
runSqlite ":memory:"
$ do { titems <- atomically $ newTVar [];
liftIO $ warpEnv (Links titems) }
我理解这些类型不匹配,但不确定我必须使用哪些函数来修复它。如果有人能向我解释发生了什么,我将不胜感激。
答案 0 :(得分:0)
您需要在liftIO
前面添加atomically
,以便将IO
操作提升为持久性monad。