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

来源:互联网 发布:手机淘宝怎样申请账号 编辑:程序博客网 时间:2024/06/08 04:26

IORef

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

函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 modifyIORef 引用以及修改值的函数 修改引用的值
Prelude> :m +Data.IORefPrelude Data.IORef> a <- newIORef 1Prelude Data.IORef> v <- readIORef aPrelude Data.IORef> writeIORef a $ v + 1Prelude Data.IORef> readIORef a2Prelude Data.IORef> modifyIORef a (+1)Prelude Data.IORef> readIORef a3Prelude 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.STimport Data.STRefimport Data.IORefcounterIO :: IO (IO Int)counterIO = do    c <- newIORef 0    return $ do        modifyIORef c (+1)        readIORef ccounterST :: ST s (ST s Int)counterST = do    c <- newSTRef 0    return $ do        modifySTRef c (+1)        readSTRef cmain = do    f <- counterIO    print =<< f    print =<< f    print =<< f    print $ runST $ do        f2 <- counterST        x <- f2        y <- f2        z <- f2        return (x, y, z)
123(1,2,3)