我可能在做一些愚蠢的事情,但是我想在同一函数中将一些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不太了解,所以我在这里有点迷失。
答案 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
)更加通用