• 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)
    
  • 相关阅读:
    证明欧几里得算法的正确性
    基础练习 十六进制转换八进制
    算法训练 关联矩阵
    寻找数组中最大值
    Torry的困惑(基本型)
    最小乘积(基本型)
    矩阵乘法
    SaltStack Char02 组件
    SaltStack Char01
    Python 学习手册, char 14
  • 原文地址:https://www.cnblogs.com/zwvista/p/7591262.html
Copyright © 2020-2023  润新知