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: ...
随机推荐
- md5,base64,rsa
MD5功能: 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹): 不同的输入得到的不同的结果(唯一性): 根据128位的输出结果不可能反推出输入的信息(不可逆): 1. ...
- Eclipse相对路径
Eclipse将java源文件存于src文件夹,而编译生成的class文件存于bin目录下,故以下代码输出的结果为false public class FileTest { public static ...
- Angular 4 父组件调用子组件中的方法
1. 创建工程 ng new demo3 2. 创建子组件 ng g component child 3. 在子组件中定义方法greeting 4. 父组件html(第三行是模板中调用子组件的方法) ...
- Juery 实现淡出 淡现效果
HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- robots写法及相关命令介绍
当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问 的范围:如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有 ...
- 转载-MyBatis学习总结
MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合 孤傲苍狼 2015-02-07 00:09 阅读:89825 评论:54 MyBatis学习总结(七)——Myba ...
- 小甲鱼-003 python插曲值变量和字符串
变量名就像现实生活人们的名字,把一个值赋值给一个名字时,他会存储在内存中,称之为变量variable,在大多数语言中,都把这种行为成为"给变量赋值"或"把值存储在变量中& ...
- 1016 Phone Bills (25 分)
1016 Phone Bills (25 分) A long-distance telephone company charges its customers by the following rul ...
- 1077 Kuchiguse (20 分)
1077 Kuchiguse (20 分) The Japanese language is notorious for its sentence ending particles. Personal ...
- [UE4]使用PlayerController获取鼠标点击时的坐标
1,获取鼠标在当前场景中坐标系统的中的position,加入场景地图的范围是一千平方米,那么这个position的范围也是1000米x1000米. 注册鼠标事件 FInputActionBinding ...