现实世界中的Haskell指出"Transformer stacking order is important"。但是,我似乎无法弄清楚ExceptT (ResourceT m) a
和ResourceT (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)
即实际上等效的类型。我想您也可以在操作中证明这一点。