Haskell 创建PersistBackend的自定义实例
我有一个monad transformer堆栈,其形式如下: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
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。举起插入
我有两个不同的建议:
MonadState
的功能我赞成(1)。如果很多人都遇到了这个问题,我想我们可以有一个专门的包来提供所有函数的升级版本。现在我正在做一个类似于
runDB
的函数的YesSOD解决方案,但将来我可能会构建一个TH$(派生持久化{唯一的,存储,查询})
函数-这是对持久化模板的一个受欢迎的补充吗(如果可行的话)?理论上,是的,我认为是这样,但这似乎是一个相当大的任务。如果你打算这样做,我建议你先发邮件给YesSOD列表讨论一下。