Chr*_*ski 4 haskell haskell-persistent
我遇到了以下编译错误:
• 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]) }
Run Code Online (Sandbox Code Playgroud)
代码:
selectAll :: IO ()
selectAll = runSqlite ":memory:" $ do
records <- selectList [UserUsername ==. "abc"] [LimitTo 10]
liftIO $ print (records :: [Entity User])
Run Code Online (Sandbox Code Playgroud)
看看 runSqlite 的类型签名:
runSqlite
:: (MonadBaseControl IO m, MonadIO m, IsSqlBackend backend)
=> Text
-> ReaderT backend (NoLoggingT (ResourceT m)) a
-> m a
Run Code Online (Sandbox Code Playgroud)
我假设我需要指定runSqlite一个明确的类型,虽然我也不太清楚我的设置backend中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])
Run Code Online (Sandbox Code Playgroud)
查看 的类型runSqlite,有一个IsSqlBackend backend要满足的约束。
的定义IsSqlBackend是:
type IsSqlBackend backend =
(IsPersistBackend backend, BaseBackend backend ~ SqlBackend)
Run Code Online (Sandbox Code Playgroud)
然后抬头IsPersistBackend。
在类的定义下方,我们看到它有三个实例:
instance IsPersistBackend SqlWriteBackend
instance IsPersistBackend SqlReadBackend
instance IsPersistBackend SqlBackend
Run Code Online (Sandbox Code Playgroud)
这三种类型指定了具有各种功能的后端,其中SqlBackend最通用的一种(未知功能)。如果这就是您所需要的,请随意使用更受限制的一个。
| 归档时间: |
|
| 查看次数: |
883 次 |
| 最近记录: |