Lifting de uma função de ordem superior em Haskell
Estou tentando construir uma função do tipo:
liftSumthing :: ((a -> m b) -> m b) -> (a -> t m b) -> t m b
Ondet
é um transformador de mônada. Especificamente, estou interessado em fazer isso:
liftSumthingIO :: MonadIO m => ((a -> IO b) -> IO b) -> (a -> m b) -> m b
Eu brinquei com algumas bibliotecas de magia Haskell e sem sucesso. Como faço para acertar, ou talvez exista uma solução pronta em algum lugar que não encontrei?