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
。