runSqlite和newTVar上的类型不匹配

时间:2014-04-21 21:01:07

标签: yesod

在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) }

我理解这些类型不匹配,但不确定我必须使用哪些函数来修复它。如果有人能向我解释发生了什么,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要在liftIO前面添加atomically,以便将IO操作提升为持久性monad。