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)
Haskell语言学习笔记(20)IORef, STRef的更多相关文章
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- Haskell语言学习笔记(79)lambda演算
lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...
- Haskell语言学习笔记(69)Yesod
Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...
- Haskell语言学习笔记(39)Category
Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...
- Haskell语言学习笔记(38)Lens(1)
Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...
- Haskell语言学习笔记(72)Free Monad
安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...
- Haskell语言学习笔记(44)Lens(2)
自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...
- Haskell语言学习笔记(92)HXT
HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...
- Haskell语言学习笔记(91)Comprehension Extensions
Comprehension Extensions 关于解析式的相关语言扩展. List and Comprehension Extensions 24 Days of GHC Extensions: ...
随机推荐
- Qt下 QString转char*(转)
Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...
- DBLinq (MySQL exactly) Linq To MySql
http://blog.csdn.net/feihu_guest/article/details/7346948 DBLinq (MySQL exactly) Linq To MySql http:/ ...
- bzoj 4929: 第三题
Description 给定n,b,c,d,e以及A0,A1,···,An−1,定义 xk=b×c^4k+d×c^2k+e f(x)=Sigma(Aix^i),0<=i<=n-1 请你求出 ...
- bzoj2263: Pku3889 Fractal Streets
给出两点编号,求如图所示的图中两点间欧氏距离*10取整 递归处理由编号求出坐标 #include<cstdio> #include<cmath> int T,n,s,t; vo ...
- java DateUtils
package demoone; import java.sql.Timestamp; import java.text.ParseException; import java.text.Simple ...
- [转]下拉按钮 C#_Winform 自定义控件
[https://workspaces.codeproject.com/elia-sarti/splitbutton-an-xp-style-dropdown-split-button] using ...
- 接口测试3-4使用csv进行接口测试
参照前面的例子 向URL发送corpid和corsecret2个参数,可以获取正确的tokenid https://qyapi.weixin.qq.com/cgi-bin/gettoken 数据 场景 ...
- Linux下查看系统版本号信息的方法(转载)
原文出处 http://www.ha97.com/2987.html 1.cat /proc/version [root@localhost ~]# cat /proc/versionLinux v ...
- 搭建OpenStack先电云平台
实际操作示意图 在VMware里面创建两台centos7的虚拟机作为搭建云平台的两节点配置如下: 1.第一台虚拟机 作为控制节点 2CPU 3G以上内存 硬盘50G 网络适配器一个nat 一个仅主 ...
- pandas的map函数与apply函数的区别
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(4,3),columns=list("ABC ...