这两个monad变压器有什么区别?

时间:2016-04-16 23:50:13

标签: haskell monads transformation

我熟悉monad,例如reverse "${MYARRAY[@]}" && for i in "${reversed[@]}"; do echo $i; done ReaderError。然而,变形金刚对我来说是一个新手,因此这个问题。

直观地说,我可以看出以下两个monad变换器之间存在差异,但我无法确定它是什么......

State

是什么让这两个monad变压器不同?

2 个答案:

答案 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输入,而第二个错误则允许错误取决于EnvInteger状态。