真实世界的哈斯克尔说"Transformer stacking order is important"。但是,我似乎无法弄清楚ExceptT (ResourceT m) a
和ResourceT (ExceptT m) a
之间是否存在差异。他们会互相干扰吗?
答案 0 :(得分:4)
在这个例子中,两个订单之间没有真正的区别。原因是:与包括ExceptT
在内的许多变换器不同,资源转换器不将其自己的行为“注入”到您应用它的基本monad中,而是通过传递开始整个动作在发布参考中。
如果你写出类型(我为了简单起见,我会引用MaybeT
而不是ExceptT
;它们显然等同于这个问题的目的)然后你基本上< / p>
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)
即。实际上是同等类型我想你也可以证明这些操作。