制作 PersistBackend 的自定义实例
Posted
技术标签:
【中文标题】制作 PersistBackend 的自定义实例【英文标题】:Making Custom Instances of PersistBackend 【发布时间】:2012-01-24 18:28:13 【问题描述】:我有一个如下形式的单子变压器堆栈:
newtype T m a = T unT :: StateT State (SqlPersist m) a
deriving (Monad, MonadState State)
并且想使用持久的insert
和lookup
调用,所以我需要为T
创建一个PersistBackend
实例。但是,幻像类型将特定后端编码为 Key
返回类型 - 这会导致一些额外的麻烦。为了解决幻像类型问题,我的实例具有以下形式:
instance (Monad m, MonadIO m, MonadBaseControl IO m) => PersistBackend T m where
insert = T . lift . liftM (Key . unKey) . insert
... and about a dozen such methods ...
我是否盲目地忽略了一种更简单的方法?手动提升调用函数以外的一种方式:insertT = T . lift . insert
【问题讨论】:
【参考方案1】:我有两个不同的建议:
-
翻转事物,将 SqlPersist 放在 StateT 周围,而不是反之亦然。
创建一个具有提升版本的函数的模块,类似于
MonadState
所做的。
我会选择 (1)。如果很多人都遇到这个问题,我想我们可以有一个专门的包来提供所有功能的提升版本。
【讨论】:
现在我正在做类似runDB
的函数的 Yesod 解决方案,但将来我可能会构建一个 TH $(derivePersist
Unique
,Store
,Query
)
函数 - 这是对持久模板的一个受欢迎的补充(如果可行的话)?
理论上,是的,我想是的,但这似乎是一项艰巨的任务。如果您打算处理此问题,我建议您先通过电子邮件发送 yesod 列表进行讨论。以上是关于制作 PersistBackend 的自定义实例的主要内容,如果未能解决你的问题,请参考以下文章