effect-monad-0.7.0.0: examples/Problem1.hs
{-# LANGUAGE NoMonomorphismRestriction, FlexibleContexts #-}
import Control.Monad.State.Lazy
appendBuffer x = do buff <- get
put (buff ++ x)
hello :: Monad m => StateT String (StateT String m) ()
hello = do name <- get
lift $ appendBuffer $ "hello " ++ name
incSC :: (Monad m) => StateT Int m ()
incSC = do x <- get
put (x + 1)
writeS :: (Monad m) => [a] -> StateT [a] m ()
writeS y = do x <- get
put (x ++ y)
write :: (Monad m) => [a] -> StateT [a] (StateT Int m) ()
write x = do writeS x
lift $ incSC
hellow = do write "hello"
write " "
write "world"
runHellow = runStateT (runStateT hellow "") 0
-- prog2 :: (Monad m) => StateT Int (StateT String (StateT Int (StateT String m))) ()
hellowCount = do hellow
lift $ lift $ incSC
runHellowCount = runStateT (runStateT (runStateT hellowCount "") 0) 1