升降机部分升降

我正在尝试做一些可能不可能的事情。 我有一个类型是MonadIO一个实例。 如果在这种类型是某些变压器堆栈的基本单元的上下文中liftIO IO操作,则它将正常工作。 所以,我希望能够做到的是取得一个已经被部分取消的价值(以我的方式),并一举解除它的“其余部分”。

我可以用两种方法做到这一点。 一个是我的类型实际上可以重新嵌入到正常的IO中,所以我可以这样做:

liftMore :: (MonadIO m) => MyType a -> m a
liftMore x = liftIO $ embedMyTypeInIO x

这工作。 然而,这也提供了一种完全从我的类型转义的方法,如果在IO是基本monad的上下文中使用,这是不可取的。

我也可以通过构建一个像MonadIO这样使用我的类型作为基础的新类型类来完成此MonadIO ,但这需要为所有内容实例化,这是非常不可取的。 我尝试使用newtype包装器来使每个monad转换器成为这样一个类的实例,但无法完全实现。

任何关于策略的想法我都可以尝试做到这一点? (我愿意玩语言扩展,但当然,Haskell98的解决方案更受欢迎)。

链接地址: http://www.djcxy.com/p/66623.html

上一篇: Partially lift with liftIO

下一篇: fd, monadLib, and the paradox of choice