2

次のコードで何が起こるかを理解しようとしています。コードは適切に動作しますが、その理由を理解しようとしています。

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 を連続して呼び出すたびに「リセット」されない理由です。状態は変数として渡され>>ますか?もしそうなら、誰かが私にその方法を教えてくれますか?

4

1 に答える 1