What is the difference between these two monad transformers?

I am familiar with monads, for example. Reader, Errorand State. Transformers, however, are very new to me, so this is the question.

Intuitively, I can say that there is a difference between the next two monad transformers, but I can’t determine exactly what it is.

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

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

What is the difference between these two monad transformers?

+4
source share
2 answers

To simplify, compare only the relevant part (which is not trivially the same):

MaybeT (StateT Integer Identity) a
StateT Integer (MaybeT Identity) a

We know that (ignoring abstractions newtype)

type MaybeT m a = m (Maybe a)
type StateT s m a = s -> m (a, s)

Consequently, two transformer stacks look like

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

and

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

, , , Maybe. , MaybeT , , Nothing, MaybeT , State .

IO: , – IO. , IOT.

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

, Env, Env, Integer.

+1

All Articles