不使用类似的技巧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)