Добро пожаловать в Stackoverflow. К сожалению, то, что вы просите, немного противоречиво. Как упоминал Робин, если типом является Integer, значение всегда будет одинаковым в Haskell.
Как вы говорите, ответ должен быть " не чистым ", возможное решениезаключается в привлечении монады IO. То есть вам придется разместить свою изменчивую сущность во «внешнем мире», то есть в монаде IO, если говорить о времени выполнения Haskell.
Примерно так:
$ ghci
GHCi, version 8.2.2: http://www.haskell.org/ghc/ :? for help
Prelude>
Prelude> import Data.IORef
Prelude Data.IORef> mv <- newIORef ((0)::Integer)
Prelude Data.IORef> let next_nat = do { val <- readIORef mv ; modifyIORef' mv (\x -> 1+x) ; return val ; }
Prelude Data.IORef>
Prelude Data.IORef> next_nat
0
Prelude Data.IORef> next_nat
1
Prelude Data.IORef> next_nat
2
Prelude Data.IORef> next_nat
3
Prelude Data.IORef>
Подробнее см. В документации Data.IORef .
Печатная информация:
Prelude Data.IORef> :t mv
mv :: IORef Integer
Prelude Data.IORef> :t next_nat
next_nat :: IO Integer
Prelude Data.IORef>