【问题标题】:Making Custom Instances of PersistBackend制作 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

【问题讨论】:

    标签: haskell persistent yesod


    【解决方案1】:

    我有两个不同的建议:

    1. 翻转事物,将 SqlPersist 放在 StateT 周围,而不是反之亦然。
    2. 创建一个具有提升版本的函数的模块,类似于 MonadState 所做的。

    我会选择 (1)。如果很多人都遇到这个问题,我想我们可以有一个专门的包来提供所有功能的提升版本。

    【讨论】:

    • 现在我正在做类似 runDB 的函数的 Yesod 解决方案,但将来我可能会构建一个 TH $(derivePersist{Unique,Store,Query} ) 函数 - 这是对持久模板的一个受欢迎的补充(如果可行的话)?
    • 理论上,是的,我想是的,但这似乎是一项艰巨的任务。如果您打算处理此问题,我建议您先通过电子邮件发送 yesod 列表进行讨论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2016-05-04
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多