现实世界 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)
即实际上是等价的类型。我想您也可以为操作展示这一点。
关于haskell - “ExceptT ResourceT”与 'ResourceT ExceptT',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34403139/