制作 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)

并且想使用持久的insertlookup 调用,所以我需要为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 $(derivePersistUnique,Store,Query ) 函数 - 这是对持久模板的一个受欢迎的补充(如果可行的话)? 理论上,是的,我想是的,但这似乎是一项艰巨的任务。如果您打算处理此问题,我建议您先通过电子邮件发送 yesod 列表进行讨论。

以上是关于制作 PersistBackend 的自定义实例的主要内容,如果未能解决你的问题,请参考以下文章

如何制作自己的自定义 QNetworkReply?

制作 dplyr 过程的自定义函数

无法在连接的自定义 UITableViewCell 类中制作插座

如何制作可拉伸的自定义 UITablecell

如何在android中制作带有圆角的自定义对话框

如何制作突出显示的自定义按钮[重复]