我遇到以下编译错误:
• Couldn't match type ‘BaseBackend backend0’ with ‘SqlBackend’
arising from a use of ‘runSqlite’
The type variable ‘backend0’ is ambiguous
• In the expression: runSqlite ":memory:"
In the expression:
runSqlite ":memory:"
$ do { records <- selectList [UserUsername ==. "abc"] [LimitTo 10];
liftIO $ print (records :: [Entity User]) }
In an equation for ‘selectAll’:
selectAll
= runSqlite ":memory:"
$ do { records <- selectList [UserUsername ==. "abc"] [LimitTo 10];
liftIO $ print (records :: [Entity User]) }
Code:
selectAll :: IO ()
selectAll = runSqlite ":memory:" $ do
records <- selectList [UserUsername ==. "abc"] [LimitTo 10]
liftIO $ print (records :: [Entity User])
看一下 runSqlite 的类型签名:
runSqlite
:: (MonadBaseControl IO m, MonadIO m, IsSqlBackend backend)
=> Text
-> ReaderT backend (NoLoggingT (ResourceT m)) a
-> m a
我假设我需要为 runSqlite 指定一个显式类型,尽管我不太确定我设置的是什么backend
in ReaderT backend (NoLoggingT (ResourceT m)) a
?
您可以专注于SqlBackend
.
asSqlBackendReader :: ReaderT SqlBackend m a -> ReaderT SqlBackend m a
asSqlBackendReader = id
selectAll :: IO ()
selectAll = runSqlite ":memory:" . asSqlBackendReader $ do
records <- selectList [UserUsername ==. "abc"] [LimitTo 10]
liftIO $ print (records :: [Entity User])
看看类型runSqlite
,有一个IsSqlBackend backend
需要满足的约束。
的定义IsSqlBackend https://hackage.haskell.org/package/persistent-2.7.0/docs/Database-Persist-Sql.html#t:IsSqlBackend is:
type IsSqlBackend backend =
(IsPersistBackend backend, BaseBackend backend ~ SqlBackend)
然后抬头看IsPersistBackend https://hackage.haskell.org/package/persistent-2.7.0/docs/Database-Persist-Class.html#t:IsPersistBackend.
在类的定义下面,我们看到它有三个实例:
instance IsPersistBackend SqlWriteBackend
instance IsPersistBackend SqlReadBackend
instance IsPersistBackend SqlBackend
这三种类型指定具有不同功能的后端,其中SqlBackend
是最通用的一种(未知功能)。如果您只需要这样,请随意使用限制更严格的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)