When learning the haskell monad transformer(would call it monadt in the left content), a problem in my mind is why monadT
?
Because from a simple example view, we could make a pale of monad together to do what we want we want to do.
Technially, it's correct, the monadT is just a wrapper. For example, those two cases are equal.
ioOp :: IO String
ioOp = getLine
maybeOp :: Maybe String -> Maybe String