我正在尝试做一些可能不可能完成的事情。我的类型是MonadIO
的实例。如果你在这种类型是某个变换器堆栈的基本monad的上下文中liftIO
IO
动作,它将正常工作。所以,我希望能够做的就是获取一个已经被部分提升的价值(对我的类型),然后一步一步将其提升为“剩余部分”。
我可以用两种方式做到这一点。一个是我的类型实际上可以简单地重新嵌入到普通的IO中,所以我可以这样做:
liftMore :: (MonadIO m) => MyType a -> m a
liftMore x = liftIO $ embedMyTypeInIO x
这很有效。但是,如果在仅IO
是基本monad的上下文中使用,这也提供了一种完全脱离我的类型的方法,这是不可取的。
我也可以通过构建像MonadIO
这样使用我的类型作为基础的新类型类来做到这一点,但是它需要为所有内容实例化,这是非常不受欢迎的。我尝试使用newtype包装器使每个monad转换器成为这样一个类的实例,但是不能完全得到它。
关于战略的任何想法我都可以尝试实现这一目标吗? (我愿意使用语言扩展,但当然Haskell98的解决方案更受欢迎)。