首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Esqueleto和Persistent在同一功能中的混合

Esqueleto和Persistent在同一功能中的混合
EN

Stack Overflow用户
提问于 2018-10-05 03:22:03
回答 1查看 129关注 0票数 2

我可能做了一些非常愚蠢的事情,但我想将一些Esqueleto和相同功能中的常规持久查询混合在一起。

我的职责是:

代码语言:javascript
复制
handleFactionConstruction :: (BaseBackend backend ~ SqlBackend,
    PersistStoreWrite backend, PersistQueryRead backend, 
    PersistUniqueRead backend, MonadIO m) =>
    Time -> Entity Faction -> ReaderT backend m ()
handleFactionConstruction date faction = do
    planets <- selectList [ PlanetOwnerId ==. Just (entityKey faction)] []
    queues <- mapM loadPlanetConstructionQueue $ map entityKey planets
    return ()

loadPlanetConstructionQueue有签名(这个签名执行一个连接,因此我想在这里使用Esqueleto ):

代码语言:javascript
复制
loadPlanetConstructionQueue :: (MonadIO m, BackendCompatible SqlBackend backend, 
    PersistQueryRead backend, PersistUniqueRead backend) =>
    Key Planet -> ReaderT backend m (Maybe (Entity Planet), [Entity BuildingConstruction

这不起作用,我得到以下错误:

代码语言:javascript
复制
Could not deduce (BackendCompatible SqlBackend backend)
    arising from a use of ‘loadPlanetConstructionQueue’
  from the context: (BaseBackend backend ~ SqlBackend,
                     PersistStoreWrite backend, PersistQueryRead backend,
                     PersistUniqueRead backend, MonadIO m)
    bound by the type signature for:
               handleFactionConstruction :: forall backend (m :: * -> *).
                                            (BaseBackend backend ~ SqlBackend,
                                             PersistStoreWrite backend,
                                             PersistQueryRead backend,
                                             PersistUniqueRead backend, MonadIO m) =>
                                            Time -> Entity Faction -> ReaderT backend m ()

我认为这与"BackendCompatible SqlBackend后端“和"BaseBackend后端~ SqlBackend”之间的区别有关。

有什么办法能让我做到这一点吗?在这种情况下,我可以用Esqueleto编写selectList部分,但是在更长的一段时间内需要使用replace,这是Esqueleto不支持的(我认为)。

我对Haskell,Persistent或Esqueleto不太了解,所以我有点迷失在这里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-05 13:37:49

可以将BackendCompatible SqlBackend backend添加到handleFactionConstruction的约束列表中,以获得:

代码语言:javascript
复制
handleFactionConstruction :: (BaseBackend backend ~ SqlBackend,
    BackendCompatible SqlBackend backend
    PersistStoreWrite backend, PersistQueryRead backend, 
    PersistUniqueRead backend, MonadIO m) =>
    Time -> Entity Faction -> ReaderT backend m ()

更普遍地说,Could not deduce错误意味着您的类型签名比它允许的一个函数更通用。处理这一问题的方法有三种:

  • 添加约束,使类型签名更加具体(如上面所示)
  • 使您调用的函数(loadPlanetConstructionQueue)更通用
  • 如果上述两种方法都不可能,请以其他方式重写代码。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52657920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档