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