Haskell语言学习笔记(20)IORef, STRef

IORef

一个在IO monad中使用变量的类型。

函数参数功能
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中使用变量的类型。

函数参数功能
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)

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值