'ExceptT ResourceT'与'ResourceT ExceptT'的区别

5

《Real World Haskell》指出“变换器堆叠顺序很重要”。然而,我无法确定ExceptT (ResourceT m) aResourceT (ExceptT m) a之间是否有区别。它们会互相干扰吗?

1个回答

4
在这个例子中,两种顺序之间没有真正的区别。原因是:与包括 ExceptT 在内的许多转换器不同,资源转换器并没有将其自己的操作“注入”到您应用它的基本单子中,而是通过传递释放引用来开始整个操作。
如果您写出类型(为简单起见,我将使用 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)

即实际上等效的类型。我想你也可以展示操作的等效性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接