'ExceptT ResourceT' 对比 'ResourceT ExceptT'

'ExceptT ResourceT' vs 'ResourceT ExceptT'

真实世界 Haskell 指出 "Transformer stacking order is important"。但是,我似乎无法弄清楚 ExceptT (ResourceT m) aResourceT (ExceptT m) a 之间是否存在差异。会不会互相干扰?

在这个例子中,两个订单之间没有真正的区别。原因是:与包括 ExceptT 在内的许多转换器不同,资源转换器 而不是 “注入”它自己的行为到你应用它的基础 monad 中,而是从整个传递发布引用的操作。

如果你写出类型(为了简单起见,我将引用 MaybeT 而不是 ExceptT;对于这个问题,它们显然是等价的)那么你有基本上

type MaybeResourceT m a = MaybeT (IORef RelMap -> m a)
                        = IORef RelMap -> m (Maybe a)
type ResourceMaybeT m a = ResourceT (m (Maybe a))
                        = IORef RelMap -> m (Maybe a)

即实际上等价的类型。我想你也可以为操作证明这一点。