import Control.Monad import Control.Monad.State.Lazy import Data.List import Data.Function test :: StateT [Int] [] () test = do x'@(x:xs) <- get rule <- lift [(+4), (*2), (`rem` 3)] put $ (rule x):x' return () main :: IO () main = do mapM_ (print . reverse) $ execStateT (replicateM 3 test) [1]