кода, где видны различия?
import Control.Monad.Trans.* - это из пакета transformers, там объявлены сами типы. Работать через этот импорт можно, но неудобно, придётся в подлежащий стек монад руками всё протаскивать через MonadTrans(lift). import Control.Monad.State.* - это из пакета mtl, который расширяет transformers удобными ручками и позволяет делать вот так bar :: MonadState Foo m => Int -> m Int, т.е., написать функцию работающую с любой монадой m, реализующей MonadState. Например с ReaderT Env (StateT St IO). Используя трансформеры напрямую, пришлось бы делать do lift (put st1); lift (lift (print st1)), с mtl же можно просто do put st1; liftIO (print st1). — *.Strict - это для случаев, когда стейт нужен не-ленивый - то есть, почти всегда.
TL;DR: import Control.Monad.State.Strict
Обсуждают сегодня