导致“无法匹配类型'BaseBackend backend0'与'SqlBackend'的错误的持久selectList” [英] Persistent selectList causing error of "Couldn't match type ‘BaseBackend backend0’ with ‘SqlBackend’"

查看:203
本文介绍了导致“无法匹配类型'BaseBackend backend0'与'SqlBackend'的错误的持久selectList”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 •无法将类型'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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆