Haskell 这两个单声道变压器有什么区别?

Haskell 这两个单声道变压器有什么区别?,haskell,monads,transformation,Haskell,Monads,Transformation,我熟悉monad,例如阅读器,错误,以及状态。然而,变形金刚对我来说是非常新的,因此这个问题 凭直觉,我可以看出以下两个单声道变压器之间有区别,但我不能很准确地指出它是什么 ReaderT Env (ErrorT String (StateT Integer Identity)) a ReaderT Env (StateT Integer (ErrorT String Identity)) a 是什么使这两个单声道变压器不同?为了简化,只比较相关部分(并非完全相同): 我们知道(忽略newt

我熟悉monad,例如
阅读器
错误
,以及
状态
。然而,变形金刚对我来说是非常新的,因此这个问题

凭直觉,我可以看出以下两个单声道变压器之间有区别,但我不能很准确地指出它是什么

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

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

是什么使这两个单声道变压器不同?

为了简化,只比较相关部分(并非完全相同):

我们知道(忽略
newtype
抽象)

因此,两个变压器组被证明是

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

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

对于
IO
,这种情况甚至更为严重:一旦出现异常,就不可能继续–异常只能在
IO
本身中捕获。这就是为什么没有
IOT
变压器的原因之一

ReaderT Env (ErrorT String (StateT Integer Identity)) a
ReaderT Env (StateT Integer (ErrorT String Identity)) a
简而言之,在第一种情况下,错误仅取决于
Env
输入,而第二种情况允许错误同时取决于
Env
Integer
状态

MaybeT (Λb. Integer -> (b, Integer)) a
    ≡ Integer -> (Maybe a, Integer)
StateT Integer (Λb. Maybe b) a
    ≡ Integer -> Maybe (a, Integer)
ReaderT Env (ErrorT String (StateT Integer Identity)) a
ReaderT Env (StateT Integer (ErrorT String Identity)) a