如何使用Monad实现全局计数器?

| 我需要一个全局计数器,从0、1、2、3等开始。 我有点理解,这个“不纯正”的代码应该单独实现...我才刚刚开始理解Monad,但不知道如何使用Monad实现此全局计数器?这对于了解是否有可能是非常有用的示例     
已邀请:
        State 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
这里的'makeCounter \'创建一个全局的可变变量,该变量在调用之间保持其状态并破坏了纯度。例如,在主函数中,对\'testCounter \'的两个相同调用给出了不同的结果。
> main
[1,2,3]
[4,5,6]
    
        您可以使用
State
monad来实现此功能,该计数器将计数器的当前值存储为状态。然后可以使用
get
获取当前计数器值,并使用
modify (+1)
对其进行递增。 其中一个有用的变化是
Supply
monad,您可以在其中使用任意序列作为\“ counter \”,因此要使纯计数器从零开始,只需使用
[0..]
作为电源即可。     
        您可以查看的是State monad。这是一个通用monad,可用于管理状态。在您的情况下,计数器只是您要维护的状态。 http://www.haskell.org/haskellwiki/State_Monad     
        尽管State很好,但您在计算时不需要检查计数器,而只是增加它,因此Writer monad应该足够。有关介绍(不太严重)的信息,请参阅了解Haskell。     

要回复问题请先登录注册