这两个 Monad Transformer 有什么不同?

4
我熟悉单子,例如 ReaderErrorState。然而,变换器对我来说是非常新的,因此有这个问题。
直观地说,我可以告诉以下两个单子变换器之间存在差异,但我无法确定具体差异在哪里...
ReaderT Env (ErrorT String (StateT Integer Identity)) a

ReaderT Env (StateT Integer (ErrorT String Identity)) a

这两个单子变换器有何不同之处?
2个回答

5
为了简化,仅比较相关部分(这并不是显然相同的):
MaybeT (StateT Integer Identity) a
StateT Integer (MaybeT Identity) a

我们知道(忽略newtype抽象)
type MaybeT m a = m (Maybe a)
type StateT s m a = s -> m (a, s)

因此,这两个变压器堆叠起来的结果是:
MaybeT (Λb. Integer -> (b, Integer)) a
    ≡ Integer -> (Maybe a, Integer)

并且

StateT Integer (Λb. Maybe b) a
    ≡ Integer -> Maybe (a, Integer)

所以,它们并不完全相同,区别在于后者仅产生Maybe内部的状态整数。这意味着,如果MaybeT在堆栈中,则必须立即终止计算,一旦获得Nothing。而如果MaybeT在顶部使用,则State仍然可以继续执行。

这在IO中更为严重:一旦出现异常,就无法继续 - 异常只能在IO本身中捕获。这是为什么不存在IOT转换器的原因之一。


1
ReaderT Env (ErrorT String (StateT Integer Identity)) a
ReaderT Env (StateT Integer (ErrorT String Identity)) a

简单来说,第一个错误只取决于 Env 输入,而第二个错误允许错误依赖于 EnvInteger 状态。

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