首页 > 解决方案 > 如何将 Persistent 的 SqlBackend 与自定义 monad “组合”?

问题描述

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

BaseBackendHasPersistentBackend类型类的一部分:

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

标签: haskellyesodmonad-transformershaskell-persistent

解决方案


推荐阅读