现实世界中的Haskell指出"Transformer stacking order is important"。但是,我似乎无法弄清楚ExceptT (ResourceT m) aResourceT (ExceptT m) a之间是否有区别。他们会互相干扰吗?

最佳答案

在此示例中,两个订单之间没有真正的区别。原因是:与包括ExceptT的许多转换器不同,资源转换器不会“将”自己的操作“注入(inject)”您将其应用到的基本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)

即实际上等效的类型。我想您也可以在操作中证明这一点。

10-06 02:44