我的Servant应用程序有一个自定义monad堆栈,我想保留一个ReaderT
,而不是SqlPersistT
或类似的“洋葱”。问题是,我无法找到任何代码样本。
似乎大多数Persistent函数在以下monad中返回一个动作:(MonadIO m, PersistRecordBackend record backend) => ReaderT backend m record
以下是PersistRecordBackend
:
type PersistRecordBackend record backend = (PersistEntity record, PersistEntityBackend record ~ BaseBackend backend)
BaseBackend
是HasPersistentBackend
类型类的一部分:
class HasPeristenBackend backend where
type BaseBackend backend
persistBackend :: backend -> BaseBackend backend
因此,如果我走在正确的轨道上,我的自定义AppM
或Env
必须实现此HasPersistentBackend
类型类。
data Env = Env {envDbPool, envLogger, envOtherStuff}
type AppM = ReaderT Env IO
任何帮助实现这项工作将不胜感激。最后,我希望能够直接在runSqlPool
中致电AppM
(即没有任何形式的lift
)