Государственная монада дает вам состояние, но только внутри монады.Он не является постоянным при повторных вызовах функции.
Если вы хотите действительно глобальное, изменяемое состояние, вы можете сделать что-то вроде:
import Data.IORef
type Counter = Int -> IO Int
makeCounter :: IO Counter
makeCounter = do
r <- newIORef 0
return (\i -> do modifyIORef r (+i)
readIORef r)
testCounter :: Counter -> IO ()
testCounter counter = do
b <- counter 1
c <- counter 1
d <- counter 1
print [b,c,d]
main = do
counter <- makeCounter
testCounter counter
testCounter counter
Здесь 'makeCounter' создает глобальную переменную, которая сохраняет свое состояние при вызовах и уничтожаетчистота.Например, в основной функции два идентичных вызова testCounter дают разные результаты.
> main
[1,2,3]
[4,5,6]