haskell - 持久的 selectList 导致错误 "Couldn' t 匹配类型 ‘BaseBackend backend0’ 与 ‘SqlBackend’"

标签 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]) }

代码:
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 设置了什么在 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 的定义是:
type IsSqlBackend backend =
  (IsPersistBackend backend, BaseBackend backend ~ SqlBackend)

那就查 IsPersistBackend .

在类的定义下方,我们看到它有三个实例:
instance IsPersistBackend SqlWriteBackend
instance IsPersistBackend SqlReadBackend
instance IsPersistBackend SqlBackend

这三种类型指定了具有各种功能的后端,SqlBackend是最通用的(未知功能)。如果这就是您所需要的,请随意使用更受限制的一个。

关于haskell - 持久的 selectList 导致错误 "Couldn' t 匹配类型 ‘BaseBackend backend0’ 与 ‘SqlBackend’",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249710/

相关文章:

haskell - 持久性 - 如何过滤记录列的字段

haskell - 持久内连接还是应该使用 esqueleto?

haskell - yesod-sqlite 模板中的 "import Database.Persist as X hiding (get)"是如何工作的

haskell - foldr 和 foldl 之间的区别对于 map 和集合是否重要?

haskell - Haskell 软实时的当前状态

Haskell 术语 : Part of type signature following constraints

haskell - 懒惰的字节串 : memory exploding in certain cases

sql - 在 Haskell/Persistent 中使用没有 ID 列的 SQL 表

sql - Haskell 对日期的持久查询 (Yesod)

haskell - 通过++ 或 <> 进行字符串连接