我发现 monad 转换器的问题之一是需要对lift
正确的 monad 进行操作。一个lift
在这里和那里都不错,但有时有些功能看起来像这样:
fun = do
lift a
lift b
c
lift d
lift e
f
我希望能够编写这个函数:
fun = monadInvert $ do
a
b
lift c
d
e
lift f
这将 s 的数量减半lift
,并使代码更清晰。
问题是:什么单子是monadInvert
可能的?应该如何创建这个功能?
加分点:定义它monad m
是MonadIO
.
这个问题的标题谈到了排列:确实,我们如何处理 monad 转换器堆栈的任意排列?