Haskell 这两个单声道变压器有什么区别?
我熟悉monad,例如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
阅读器
,错误
,以及状态
。然而,变形金刚对我来说是非常新的,因此这个问题
凭直觉,我可以看出以下两个单声道变压器之间有区别,但我不能很准确地指出它是什么
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