Я пытаюсь понять, что происходит в следующем коде, код работает правильно, но я пытаюсь понять почему.
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. Передается ли состояние как переменная с каждым >>
, и если да, то может ли кто-нибудь показать мне, как это сделать?