一個在IO monad中使用變量的類型。javascript
函數 | 參數 | 功能 |
---|---|---|
newIORef | 值 | 新建帶初值的引用 |
readIORef | 引用 | 讀取引用的值 |
writeIORef | 引用和值 | 設置引用的值 |
modifyIORef | 引用以及修改值的函數 | 修改引用的值 |
Prelude> :m +Data.IORef Prelude Data.IORef> a <- newIORef 1 Prelude Data.IORef> v <- readIORef a Prelude Data.IORef> writeIORef a $ v + 1 Prelude Data.IORef> readIORef a 2 Prelude Data.IORef> modifyIORef a (+1) Prelude Data.IORef> readIORef a 3 Prelude Data.IORef> a <- sequence [newIORef 0, newIORef 1, newIORef 2] Prelude Data.IORef> readIORef (a !! 0) 0
一個在ST monad中使用變量的類型。java
函數 | 參數 | 功能 |
---|---|---|
newSTRef | 值 | 新建帶初值的引用 |
readSTRef | 引用 | 讀取引用的值 |
writeSTRef | 引用和值 | 設置引用的值 |
modifySTRef | 引用以及修改值的函數 | 修改引用的值 |
counter閉包閉包
Javascript語言實現函數
function counter() { var c = 0; return function() { return ++c; }; } var f = counter(); console.log(f()); console.log(f()); console.log(f());
Haskell語言實現(使用 IORef 和 STRef)code
import Control.Monad.ST import Data.STRef import Data.IORef counterIO :: IO (IO Int) counterIO = do c <- newIORef 0 return $ do modifyIORef c (+1) readIORef c counterST :: ST s (ST s Int) counterST = do c <- newSTRef 0 return $ do modifySTRef c (+1) readSTRef c main = do f <- counterIO print =<< f print =<< f print =<< f print $ runST $ do f2 <- counterST x <- f2 y <- f2 z <- f2 return (x, y, z)
1 2 3 (1,2,3)