我熟悉monad,例如reverse "${MYARRAY[@]}" && for i in "${reversed[@]}"; do echo $i; done
,Reader
和Error
。然而,变形金刚对我来说是一个新手,因此这个问题。
直观地说,我可以看出以下两个monad变换器之间存在差异,但我无法确定它是什么......
State
是什么让这两个monad变压器不同?
答案 0 :(得分: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
在顶部使用,则{{1}仍然可以继续前进。
State
更加激烈:一旦您收到异常, 可能会继续 - 异常只能在IO
本身中捕获。这就是为什么没有IO
变换器的原因之一。
答案 1 :(得分:1)
ReaderT Env (ErrorT String (StateT Integer Identity)) a
ReaderT Env (StateT Integer (ErrorT String Identity)) a
简而言之,第一个错误仅取决于Env
输入,而第二个错误则允许错误取决于Env
和Integer
状态。