我需要一个全局计数器,从0,1,2,3开始.....我有点明白这个"不纯"的代码应该单独实现......我刚刚开始理解Monad,但是我不知道如何使用Monad实现这个全局计数器?这可能是了解是否可行的非常有用的示例
州monad给你状态但只在monad里面.它在函数的重复调用中不是持久的.
如果你想要真正的全局,可变状态,你可能想做类似的事情:
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
Run Code Online (Sandbox Code Playgroud)
这里'makeCounter'创建了一个全局的,可变的变量,它保持调用状态并破坏纯度.例如,在main函数中,对'testCounter'的两次相同调用会产生不同的结果.
> main
[1,2,3]
[4,5,6]
Run Code Online (Sandbox Code Playgroud)
你可以看到的是州monad.这是一个通用monad,可用于管理状态.在您的情况下,计数器只是您想要维护的状态.
http://www.haskell.org/haskellwiki/State_Monad