Haskell 创建PersistBackend的自定义实例

Haskell 创建PersistBackend的自定义实例,haskell,persistent,yesod,Haskell,Persistent,Yesod,我有一个monad transformer堆栈,其形式如下: newtype T m a = T { unT :: StateT State (SqlPersist m) a } deriving (Monad, MonadState State) instance (Monad m, MonadIO m, MonadBaseControl IO m) => PersistBackend T m where insert = T . lift . liftM (Key . u

我有一个monad transformer堆栈,其形式如下:

newtype T m a = T { unT :: StateT State (SqlPersist m) a }
   deriving (Monad, MonadState State)
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 ...
并且想要使用持久的
insert
lookup
调用,所以我需要为
T
创建一个
PersistBackend
实例。但是,幻影类型将特定后端编码为
返回类型-这会导致一些额外的麻烦。为了解决幻影类型问题,我的实例的形式如下:

newtype T m a = T { unT :: StateT State (SqlPersist m) a }
   deriving (Monad, MonadState State)
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。举起插入

我有两个不同的建议:

  • 反过来,将SqlPersist放在StateT周围,而不是相反
  • 创建一个具有提升版函数的模块,类似于
    MonadState
    的功能

  • 我赞成(1)。如果很多人都遇到了这个问题,我想我们可以有一个专门的包来提供所有函数的升级版本。

    现在我正在做一个类似于
    runDB
    的函数的YesSOD解决方案,但将来我可能会构建一个TH
    $(派生持久化
    {
    唯一的
    存储
    查询
    }
    函数-这是对持久化模板的一个受欢迎的补充吗(如果可行的话)?理论上,是的,我认为是这样,但这似乎是一个相当大的任务。如果你打算这样做,我建议你先发邮件给YesSOD列表讨论一下。