Лор, а расскажи как комбинировать монад трансформеры в do нотации, вот надуманная монада в вакууме скомбининрованны ReaderT и StateT так что при разывертывании значения из оберточных типов мы в список [Int] добавляем длинну другого списка [a].
appendLength :: Monad m => ReaderT [a] (StateT [Int] m) ()
appendLength = ReaderT $ \cont -> (StateT $ \st -> return ((), (length cont:st)))
и работает типа так
*Main System.IO.Unsafe> (runStateT $ runReaderT appendLength ["yeah", "fuck"]) [6, 10]
((),[2,6,10])
Сказал Йода по левое плечо что выражение это в DO нотации записать можно.