次のコードで何が起こるかを理解しようとしています。コードは適切に動作しますが、その理由を理解しようとしています。
import Control.Monad.State
import System.IO
import System.Environment
echoArgs :: [String] -> State Int [String]
echoArgs x = loopArgs x >> return x
where loopArgs [] = return ()
loopArgs s@(x':xs') = modify (+1) >> loopArgs xs'
main :: IO ()
main = do
argv <- getArgs
let s = echoArgs argv
mapM_ putStr' (evalState s 0)
putStrLn $ "\nNum Args = " ++ show (execState s 0)
where putStr' x = putStr $ x ++ " "
私が理解していないのは、State モナドの状態が loopArgs を連続して呼び出すたびに「リセット」されない理由です。状態は変数として渡され>>
ますか?もしそうなら、誰かが私にその方法を教えてくれますか?