用 Haskell 实现 newCounter :IORef 和 STRef

最后更新日期:2013-04-15

  newCounter 是用来理解闭包的一个典型函数,js 版如下:

  该函数返回一个函数,返回的函数被调用时依次返回 0, 1, 2, … 序列。

  用 Haskell 的 IORef 和 STRef 实现 mutable state 如下(不容易想到的是 newCounter 的类型,Monad 套 Monad):

  总结:

  1. js 中“不纯”的函数到 Haskell 里就不能再用函数实现了,而必须用 do block
  2. 一个返回 a 的带副作用的函数,其类型为 IO a 或 ST s a ,而一个返回这样的函数的函数(每次返回的都不一样,所以也是带副作用的)的类型为 IO (IO a) 或 ST s (ST s a)