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)

Haskell语言学习笔记(20)IORef, STRef的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  5. Haskell语言学习笔记(38)Lens(1)

    Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...

  6. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

  7. Haskell语言学习笔记(44)Lens(2)

    自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...

  8. Haskell语言学习笔记(92)HXT

    HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...

  9. Haskell语言学习笔记(91)Comprehension Extensions

    Comprehension Extensions 关于解析式的相关语言扩展. List and Comprehension Extensions 24 Days of GHC Extensions: ...

随机推荐

  1. yii2 rbac权限管理学习笔记

    下面介绍一个 yii2 的 Rbac 权限管理设置,闲话少说,直接上代码, 1.首先我们要在组件里面配置一下 Rbac ,如下所示(common/config/main-local.php或者main ...

  2. POJ2559最大矩形面积——单调栈

    题目:http://poj.org/problem?id=2559 #include<iostream> #include<cstdio> using namespace st ...

  3. hadoop技术入门学习之发行版选择

    经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易.看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个回答似乎什 ...

  4. SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud

    先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...

  5. 动态爬虫——selenium2搭载phantomjs入门范例

    这是我学习爬虫比较深入的一步了,大部分的网页抓取用urllib2都可以搞定,但是涉及到JavaScript的时候,urlopen就完全傻逼了,所以不得不用模拟浏览器,方法也有很多,此处我采用的是sel ...

  6. Django 书籍分享(PDF)

    轻量级Django 链接:https://pan.baidu.com/s/1FD5zdRIkzHI44SZ54fjt6Q 密码:6z50 精通Django 链接:https://pan.baidu.c ...

  7. 在C#客户端用HTTP上传文件到Java服务器

    在C#客户端用HTTP上传文件到Java服务器  来源:http://www.cnblogs.com/AndyDai/p/5135294.html 最近在做C / S 开发,需要在C#客户端上传文件到 ...

  8. 【Spring学习笔记-3.1】让bean获取spring容器上下文(applicationContext.xml)

    *.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:# ...

  9. windows平台安装配置Gitblit

    1 安装配置jdk环境变量 2下载GitBlit,下载地址:http://www.gitblit.com或者http://gitblit.com  解压即可 3修改gitblit\data下defau ...

  10. 绕过限制,在PC上调试微信手机页面

    场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面做一下分析,一一绕过其限制,(当然不 ...