升降机部分升降
我正在尝试做一些可能不可能的事情。 我有一个类型是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