在同一功能中混合Esqueleto和Persistent

时间:2018-10-05 03:22:03

标签: haskell esqueleto haskell-persistent

我可能在做一些愚蠢的事情,但是我想在同一函数中将一些Esqueleto与常规的Persistent查询混合使用。

我有功能:

values = ('275', '54000', '0.0', '5000.0', '0.0')
values = ('300', *values[1:])

和loadPlanetConstructionQueue具有签名(此操作执行联接,因此我想在此处使用Esqueleto):

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 :: (MonadIO m, BackendCompatible SqlBackend backend, 
    PersistQueryRead backend, PersistUniqueRead backend) =>
    Key Planet -> ReaderT backend m (Maybe (Entity Planet), [Entity BuildingConstruction

我认为这与“ BackendCompatible SqlBackend后端”和“ BaseBackend后端〜SqlBackend”之间的差异有关。

有没有办法使我的工作正常?在这种情况下,我可以用Esqueleto编写selectList部分,但在最下面的地方,将需要使用replace,但Esqueleto不支持(我认为)。

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

1 个答案:

答案 0 :(得分:1)

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

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)更加通用
  • 如果以上两种方法均不可行,请以其他方式重写代码