自然数序列发生器

Azi*_*ibo 2 monads state haskell

据我所知,Haskell没有全局状态,所以有没有办法编写一个函数f,它将返回f(n - 1)+ 1,其中n是函数调用的数量,f(1)= 0.

它不应该接受任何参数并使用像 func f

Prelude> f () 
0
Prelude> f ()
1
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 5

不使用类似的技巧unsafePerform,就不可能像你在示例中所示那样定义一个可以调用的函数.但是,可以定义执行所需操作的IO操作,并且可以像这样使用:

Prelude> x <- f 
Prelude> x
0
Prelude> x <- f
Prelude> x
1
Run Code Online (Sandbox Code Playgroud)

这是一个使用IORefs做你想做的事情的示例程序:

import Data.IORef

main = do counter <- newIORef 0
          let f = do count <- readIORef counter
                     modifyIORef counter (+ 1)
                     return count          
          x <- f
          print x
          x <- f
          print x
Run Code Online (Sandbox Code Playgroud)