Haskell 如何在复杂类(PersistBackendConn)上编写装饰器

Haskell 如何在复杂类(PersistBackendConn)上编写装饰器,haskell,Haskell,我需要修改土拨鼠库中的后端逻辑 控制表名。逻辑位于以下内容的后面: class (DbDescriptor conn, ConnectionManager conn) => PersistBackendConn conn where insert :: ( PersistEntity v , PersistBackend m , Conn m ~ conn ) => v

我需要修改土拨鼠库中的后端逻辑 控制表名。逻辑位于以下内容的后面:

class (DbDescriptor conn, ConnectionManager conn) 
   => PersistBackendConn conn where
  insert :: ( PersistEntity v 
            , PersistBackend m
            , Conn m ~ conn
            ) 
         => v 
         -> m (AutoKey v)
  ...
有一个Sqlite类型正在实例化SqliteDB的PersistBackendConn类型

instance PersistBackendConn Sqlite where
  insert v = runDb' $ insert' v
为了装饰Sqlite,我定义了我的类型和 我必须重新实例化PersisteBackendConn,将其转发到原始Sqlite实例

data MySqlite = MySqlite Sqlite

instance PersistBackendConn MySqlite where
  insert v = ??
问题是insert函数的签名没有直接提到conn/Sqlite

我不想复制/粘贴cody来重新实现所有逻辑,目标是尽可能多地授权。大多数函数必须只向前调用原始函数

我猜m是ReaderT MySqlite IO,所以下面应该可以工作,但如何说服类型检查器呢

insert v = do
   MySqlite s <- ask
   lift $ flip runReaderT s (insert v)
插入v=do

MySqlite的,嗯,你还需要一些
m
,这样
Conn m~MySqlite