Haskell語言學習筆記(20)IORef, STRef

IORef

一個在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

STRef

一個在ST monad中使用變量的類型。java

函數 參數 功能
newSTRef 新建帶初值的引用
readSTRef 引用 讀取引用的值
writeSTRef 引用和值 設置引用的值
modifySTRef 引用以及修改值的函數 修改引用的值

Counter

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)
相關文章
相關標籤/搜索