导致“无法匹配类型'BaseBackend backend0'与'SqlBackend'的错误的持久selectList” [英] Persistent selectList causing error of "Couldn't match type ‘BaseBackend backend0’ with ‘SqlBackend’"
问题描述
•无法将类型'BaseBackend backend0'与'SqlBackend'匹配'使用'runSqlite'导致的
类型变量'backend0'不明确
•在表达式中:runSqlite:memory:
在表达式中:
runSqlite:memory:
$ do {records< - selectList [UserUsername ==。 abc] [LimitTo 10];
liftIO $ print(records :: [Entity User])}
在等式'selectAll'中:
selectAll
= runSqlite:memory:
$做{记录< - 选择列表[UserUsername ==。 abc] [LimitTo 10];
liftIO $ print(records :: [Entity User])}
p>
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后端)
=>文本
- > ReaderT后端(NoLoggingT(ResourceT m))a
- > ma
我假设我需要为runSqlite指定一个显式类型,尽管我不太确定我为 backend
设置了 ReaderT后端(NoLoggingT(ResourceT m))a
?
您可以在 SqlBackend
中对其进行专门化处理。
asSqlBackendReader :: ReaderT SqlBackend ma - > ReaderT SqlBackend m a
asSqlBackendReader = id
$ b $ selectAll :: IO()
selectAll = runSqlite:memory:。 asSqlBackendReader $ do
records< - selectList [UserUsername ==。 abc] [LimitTo 10]
liftIO $ print(records :: [Entity User])
看看 runSqlite
的类型,有一个 IsSqlBackend后端
约束来满足。
IsSqlBackend
为:
type IsSqlBackend backend =
(IsPersistBackend backend,BaseBackend backend〜SqlBackend)
然后查找 IsPersistBackend
。
在类的定义下面,我们看到它有三个实例:
$ pre $实例IsPersistBackend SqlWriteBackend
实例IsPersistBackend SqlReadBackend
i nstance IsPersistBackend SqlBackend
这三种类型指定具有各种功能的后端,其中 SqlBackend
是最常用的(未知功能)。如果这是您所需要的,请随意使用更受限制的。
I'm running into the below compile error:
• 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])
Having a look at the type signature of runSqlite:
runSqlite
:: (MonadBaseControl IO m, MonadIO m, IsSqlBackend backend)
=> Text
-> ReaderT backend (NoLoggingT (ResourceT m)) a
-> m a
I would assume I need to specify an explicit type for runSqlite, though I'm not too sure what I set for backend
in ReaderT backend (NoLoggingT (ResourceT m)) a
?
You can specialize it at 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])
Looking at the type of runSqlite
, there is a IsSqlBackend backend
constraint to satisfy.
The definition of IsSqlBackend
is:
type IsSqlBackend backend =
(IsPersistBackend backend, BaseBackend backend ~ SqlBackend)
Then look up IsPersistBackend
.
Just below the definition of the class, we see that it has three instances:
instance IsPersistBackend SqlWriteBackend
instance IsPersistBackend SqlReadBackend
instance IsPersistBackend SqlBackend
The three types specify backends with various capabilities, with SqlBackend
being the most general one (unknown capabilities). Feel free to use a more restricted one if that's all you need.
这篇关于导致“无法匹配类型'BaseBackend backend0'与'SqlBackend'的错误的持久selectList”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!