我有一个用于我的仆人应用程序的自定义 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
)