zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    双系统卸载linux和装双系统的方法
    linux中使用vim编译C++程序
    存储器管理之页面置换算法
    Python中open文件的各种打开模式
    RAL调用
    分布式系统事务一致性解决方案
    消息队列设计
    nmq消息队列解析
    分布式session的实现
    分布式系统常用思想和技术总结 (入门很清楚)
  • 原文地址:https://www.cnblogs.com/zwvista/p/7591262.html
Copyright © 2011-2022 走看看