我试图理解以下代码中发生了什么,代码行为正常,但我试图理解为什么。
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 ++ " "
我不明白为什么每次连续调用 loopArgs 时 State monad 的状态都不会“重置”。状态是否作为变量传递,>>
如果是的话,有人可以告诉我怎么做吗?