3

我有一个形式的单子变压器堆栈:

newtype T m a = T { unT :: StateT State (SqlPersist m) a }
   deriving (Monad, MonadState State)

并且想使用持久化insertlookup调用,所以我需要PersistBackendT. 然而,幻象类型将特定的后端编码为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

4

1 回答 1

1

我有两个不同的建议:

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

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

于 2012-01-25T13:31:38.220 回答