haskell - “ExceptT ResourceT”与 'ResourceT ExceptT'

标签 haskell monad-transformers

现实世界 Haskell 指出 "Transformer stacking order is important" 。但是,我似乎无法弄清楚 ExceptT (ResourceT m) aResourceT (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/

相关文章:

haskell - 在 Haskell 中编写汇编程序 - 带状态的 mapM?

haskell - 代理、类型级别符号和 JSON

haskell - 为什么类型类很难实现?

haskell - 这个语句中的类型是如何解析的

scalaz List[StateT].sequence - 找不到参数 n 的隐式值 : scalaz. 适用

haskell - Monad 转换器 monad 重复

haskell - 如何理解 `MonadUnliftIO`对 "no stateful monads"的要求?

项目特定位置的 Haskell 堆栈

haskell - 高阶函数和缺乏递归

haskell - 获取 "setter"类型的记录