当前位置: 首页 > 编程日记 > 正文

一些链接, 关于不可变数据

这篇笔记介绍不可变数据, Persistent Data Structure 和 Immutable.
但是不深入数据结构实现, 函数式编程理论.


定义

https://en.wikipedia.org/wiki/Persistent_data_structure

In computing, a persistent data structure is a data structure that always preserves the previous version of itself when it is modified. Such data structures are effectively immutable, as their operations do not (visibly) update the structure in-place, but instead always yield a new updated structure.


编程语言

FP: Haskell, Clojure, Elixir
类库: immutable-js


概念的区别

http://vkostyukov.ru/posts/designing-a-pfds/

Immutability and persistent are quite similar terms, which often substitute each other. We say immutable vector (in Scala) but mean persistent vector (in Clojure): both implementations are based on the same abstract data structure Bit-Mapped Vector Trie but named differently. Although, there is a slight difference between immutability and persistence as they apply to data structures.

  • Persistent data structures support multiple versions
  • Immutable data structures aren't changeable

优势

http://stackoverflow.com/a/4400389/883571
http://www.quora.com/What-are-the-advantages-and-disadvantages-of-immu...

  • 多线程安全, 可靠
  • 对于需要多份数据的情况, 可以重用结构
  • 函数式编程

劣势

http://concurrencyfreaks.blogspot.sg/2013/10/immutable-data-structures...

  • 使用门槛
  • 需要编程语言实现好的 GC

底层实现

  • Clojure

Clojure 的数据结构实现
Understanding Clojure's Persistent Vectors, pt. 1
http://hypirion.com/musings/understanding-persistent-vector-pt-1

  • Haskell

Haskell lists are represented as singly linked list

haskelldata [] a = [] | a : [a]

http://stackoverflow.com/a/15063181/883571
http://i.stack.imgur.com/Y1Ajv.png

  • Paper

A Functional Approach to Standard Binary Heaps
http://arxiv.org/pdf/1312.4666v1.pdf


写法

  • Clojure

有变量. 但是复合数据结构是不可变的

clojure(def x 1)
(defn p []x)(p)
(def x 2)
(p)
  • Haskell

没有变量的写法, 只能用 let 定义表达式 alias name
或者在 do notation 里有赋值, 但底层不是赋值
https://en.wikibooks.org/wiki/Haskell/do_notation

haskelldo x1 <- action1x2 <- action2action3 x1 x2
haskellaction1 >>= \ x1 ->action2 >>= \ x2 ->action3 x1 x2
  • Elixir

变量被引用就是不可变的值(不过在 process 级别有私有数据)

iex(6)> a = 1
1
iex(7)> b = fn -> IO.puts a end
#Function<20.90072148/0 in :erl_eval.expr/5>
iex(8)> b.()
1
:ok
iex(9)> a = 2
2
iex(10)> b.()
1
:ok

性能问题

  • Performance

http://www.quora.com/Is-object-immutability-in-functional-programming-...

  • GHC

Data immutability forces us to produce a lot of temporary data but it also helps to collect this garbage rapidly.

https://wiki.haskell.org/GHC/Memory_Management

  • React 的性能优化
jsshouldComponentUpdate: function(nextProps, nextState) {return true;
}

https://facebook.github.io/react/docs/advanced-performance.html


immutable-js

http://facebook.github.io/immutable-js/docs/#/
https://github.com/intelie/immutable-js-diff
https://github.com/intelie/immutable-js-patch


seamless-immutable

This level of backwards compatibility requires ECMAScript 5 features like Object.defineProperty and Object.freeze to exist and work correctly, which limits the browsers that can use this library to the ones shown in the test results below. (tl;dr IE9+)

  • object.freeze

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glob...

jsvar o = Object.freeze(obj);

然而没有复用数据结构, 将会有性能问题:
https://medium.com/google-developers/javascript-application-architectu...

Well, you technically could use Object.freeze() to achieve immutability, however, the moment you need to modify those immutable objects you will need to perform a deep copy of the entire object, mutate the copy and then freeze it. This is often too slow to be of practical use in most use-cases.


怎样编写程序

  • sum
haskellfoldl f z []     = z                  
foldl f z (x:xs) = foldl f (f z x) xs
  • maximum
haskellmaximum' :: (Ord a) => [a] -> a  
maximum' [] = error "maximum of empty list"  
maximum' [x] = x  
maximum' (x:xs) = max x (maximum' xs)  
  • white/for

http://www.haskellforall.com/2012/01/haskell-for-c-programmers-for-loo...

haskellwhile :: (Monad m) => m Bool -> m a -> m ()
while cond action = doc <- condwhen c $ doactionwhile cond actionfor :: (Monad m) => m a -> m Bool -> m b -> m c -> m ()
for init cond post action = doinitwhile cond $ doactionpost
  • model
elm-- manage the model of our application over time
model : Signal Model
model =Signal.foldp update initialModel actions.signal

https://github.com/evancz/elm-todomvc/blob/master/Todo.elm#L314

相关文章:

囚犯学会编程之后会发生什么?

作者 | Simone Stolzoff译者 | 苏本如&#xff0c;责编 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】Slack是硅谷一家多元化的公司&#xff0c;它雇佣了三名以前被监禁的程序员。但事实上&#xff0c;当一个人从监狱获释时&#xff0c;监禁的耻辱…

如何定制一款12306抢票浏览器——用户界面

用户界面 我不打算写个Windows界面。因为这个软件的全部就是个浏览器。我准备将”浏览器“进行到底&#xff0c;所以我选择使用html作为我们的用户界面。我也并不打算从头开始写一个浏览器&#xff0c;我使用了《内嵌IE网页窗口中消除IE默认脚本设置影响的方法》中基于WTL的浏览…

Study on Android【四】--显示控件使用

Android的界面显示同样也是基于控件的。通常是用View&#xff08;包括ViewGroup&#xff09;控件配上XML的样式来做的。具体细节不想说了&#xff0c;可以参考 Samples里的ApiDemos/View&#xff0c;和View的Doc&#xff0c;以及Implementing a UI这篇Doc。其他还有很多&#x…

修改Vim配色方案

1. 查看备选的配色方案/usr/share/vim/vim74/colors2. 查看当前使用的配色方案在命令模式下输入 :colorscheme可见当前使用的配色方案为ron3.选择和设置配色方法编辑 ~/.vimrc文件&#xff0c;如选择ron.vim对应的配色方案&#xff0c;则添加 colorscheme ron4. 设置某项颜色--…

如何定制一款12306抢票浏览器——启动“人”线程

启动“人”线程 在《如何定制一款12306抢票浏览器——构架》一文中&#xff0c;我们提到“人”线程。对于熟悉Window编程的同学来说&#xff0c;线程间通信和信息传递不是难题。但是由于浏览器和我们“人”线程之间传递的是COM对象&#xff0c;这个过程就没有那么简单了。&…

看看你是《老朋友》(青春六人行)里的哪一个

&#xff08;点击“which friends character are you?”连接可以进入问卷页面&#xff09; Which Friends Character Are You? You are Rachel. Youre very selfish and pay great attention to image. Spoiled when you were young, you were always the popular and sn…

360金融沈赟:只有适配实践的技术才能实现价值掘金

金融科技应用的新场景、新需求层出不穷,已成为创新技术的理想“试验田”。然而当“创新”浪潮褪去&#xff0c;行业回归审慎与冷静后不难发现&#xff0c;并非所有创新技术都会深入金融土壤。对此&#xff0c;360金融首席数据科学家沈赟认为&#xff0c;只有适配实践的技术才能…

swift(一)基础变量类型

import Foundationprintln("Hello, World!")/*int a; */ var a 10 //隐式类型转换 a 9 println(a)let b 10 println(b)/* 类型标注 *///var x:Int //x 10.3不支持隐式转换let x: Int 10/* 名称不用在符合标示符的规范 */ let 常量 10/* 基本数据类型&#xff1…

如何定制一款12306抢票浏览器——实现自动查询和预订功能

检查是否进入订票页面 判断是否进入订票页面&#xff0c;我是确定了两个标准&#xff1a;&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 1 网址是否为http://www.12306.cn/mormhweb/kyfw/ 2 该页面否有查询按钮 BOOL CDeal12306WebPage::IsQueryPage( CComPt…

以数据为中心,立足六大技术支柱,英特尔推动神经拟态计算、量子计算前沿探索

近日&#xff0c;英特尔中国研究院院长宋继强围绕 “英特尔如何构建技术基石&#xff0c;驱动未来计算”为主题做了演讲。他阐述了英特尔将坚持“以数据为中心”的目标&#xff0c;并指出依托于XPU产品组合&#xff0c;英特尔通过异构整合和oneAPI软件平台来推动实现超异构计算…

Fedora 7 播放器totem

说实话&#xff0c;我喜欢这个东东&#xff0c;简约而不简单。我以前一直用mplayer&#xff0c;不过还是喜欢totem的长相。很多人说不能播放&#xff0c;可以这么做&#xff0c;让它支持全部(用mplayer的codecs)&#xff1a;(1)首先将系统已有的totem移去 # yum remove totem(2…

如何定制一款12306抢票浏览器——处理预订页面和验证码自动识别功能

判断是否进入预订页面我们先看一下预订页面的结构&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09;可以见得&#xff0c;这个页面也是嵌入了两个IFrame。关于IFrame的跨域问题&#xff0c;我已经在前一篇文章中讲述了解决办法。我判断是否是预订页面是通过两个依…

利用MTCNN和FaceNet实现人脸检测和人脸识别 | CSDN博文精选

作者 | pan_jinquan来源 | CSDN博文精选&#xff08;*点击阅读原文&#xff0c;查看作者更多文章&#xff09;人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用MTCNN和FaceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单&#xff0c;…

[导入]郁闷`````[原]

阅读全文 类别&#xff1a;职场生涯 查看评论文章来源:http://hi.baidu.com/huqing7002/blog/item/b69a27082063fbd263d98619.html转载于:https://www.cnblogs.com/huqing7002/archive/2007/12/14/1007049.html

code标签的妙用

code标签的秒用是&#xff1a; 当你写了一大版的css或者html或者其他代码&#xff0c;想要去掉代码中多余的空格和换行从而达到压缩的目的的时候&#xff0c;可以新建一个html文件&#xff0c;然后把想要压缩的代码段放到code标签里&#xff0c;保存&#xff0c;浏览器浏览&…

如何定制一款12306抢票浏览器——完结篇

差不多花了一个星期的业余时间去完成了相关的编码。最后也只是使用了5篇文章将整个大题流程和使用的关键技术介绍了一下。其中有很多酸甜苦辣,其中记忆最为深刻的就是我对图像做了处理后,tesseract-ocr对验证码识别的准确度提升非常大。当我还沉浸子在这片喜悦之中时,12306将…

所有各数据库或文件的连接串定义CHM文件.

从www.connectionstrings.com 中制作生成/Files/margiex/DotnetConn.rar

钢铁侠“变身”AI布道师?小罗伯特·唐尼这次推出一部AI科普纪录片

作者 | 若名出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;穿着一身运动便服&#xff0c;脱去了铠甲的“钢铁侠”托尼斯塔克最近出现在荧屏上&#xff0c;他正与身后的AI助手互动&#xff0c;一本正经讲解着“机器学习”、“算法”这些词汇。不过&#xff0c;这个AI…

Wireshark数据抓包教程之Wireshark的基础知识

Wireshark数据抓包教程之Wireshark的基础知识 Wireshark的基础知识 在这个网络信息时代里&#xff0c;计算机安全始终是一个让人揪心的问题&#xff0c;网络安全则有过之而无不及。Wireshark作为国际知名的网络数据抓包和分析工具&#xff0c;可以广泛地应用各种领域&#xff0…

WMI技术介绍和应用——查询快捷方式、映射磁盘和虚拟内存信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句&#xff0c;具体使用参看前面的例子。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 因为将要介绍的三个模块都比较简单&#xff0c;故将这三…

不要痴迷蓝牙耳机了,出门选这个准没错,99W+人的选择

01有一种耳机啊它是真的不适合在长途火车上使用那就蓝牙耳机除非你带充电宝还有一种耳机啊它是真的不适合丢那就是带有充电仓的耳机因为充电仓丢了这个耳机基本上就废了02这不&#xff0c;我就经历了&#xff0c;活生生的例子出差的路上在火车上把耳机充电仓给弄丢了只剩孤零零…

结构化文件存取

纲要:AssignFile: 关联Rewrite: 创建并打开一个新文件, 如已存在则覆盖Reset: 打开已存在的文件; 追加也要用它先打开, 然后再移动指针; Append 是文本文件专用的CloseFile: 关闭FileSize: 记录数FilePos: 返回文件的当前位置Seek: 把文件指针移到指定位置(只用于结构化文件)Eo…

_00021 尼娜抹微笑伊拉克_谁的的最离奇的异常第二阶段 Jedis pool.returnResource(jedis)...

笔者博文&#xff1a;妳那伊抹微笑博客地址&#xff1a;http://blog.csdn.net/u012185296博文标题&#xff1a;_00021 妳那伊抹微笑_谁的异常最诡异第二期之 Jedis pool.returnResource(jedis)个性签名&#xff1a;世界上最遥远的距离不是天涯&#xff0c;也不是海角&#xff0…

WMI技术介绍和应用——查询系统信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句&#xff0c;具体使用参看前面的例子。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 本机主要知识点是Win32_ComputerSystem类。通过该类我们…

利用OpenCV实现抖音最强变脸术 | CSDN原力计划

作者 | 亓斌来源 | CSDN原力计划获奖作品&#xff08;*点击阅读原文&#xff0c;查看作者更多文章&#xff09;最近一个“最强变脸术”又火爆抖音啦&#xff0c;还不知道的朋友建议先打开抖音&#xff0c;搜索“最强变脸术”看个十来个视频再回来看这篇文章。视频看起来炫酷&am…

思科PIX防火墙的实际应用配置

PIX&#xff1a;一个合法IP完成inside、outside和dmz之间的访问 现有条件&#xff1a;100M宽带接入&#xff0c;分配一个合法的IP&#xff08;222.134.135.98&#xff09;&#xff08;只有1个静态IP是否够用&#xff1f;&#xff09;&#xff1b;PiX515e-r-DMZ-BUN1台&#xff…

CommonJS 的 AMD 规范

异步模块定义&#xff08;Asynchronous Module Definition&#xff0c;简称 AMD&#xff09;API 描述了一种定义模块的机制&#xff0c;模块及其依赖模块可以通过这种机制进行加载。该机制特别适用于浏览器。 本规范曾被称为 Modules Transport/C&#xff0c;但本规范主要不是用…

易观的大数据中台之路

作者 | 易观CTO郭炜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;本文为CSDN即将推出的《新战场&#xff1a;决胜中台》专刊的第 2 篇文章。什么是数据中台&#xff1f;中台的定义来自于投资银行&#xff0c;简单说来&#xff0c;投行当中前台是赚钱的、后台是做支…

WMI技术介绍和应用——查询系统信息和补丁包信息

本文使用了《 WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句&#xff0c;具体使用参看前面的例子。&#xff08; 转载请指明出于breaksoftware的csdn博客&#xff09;本文主要知识点是Win32_OperatingSystem和Win32_Quick…

Winform与Webform中的对话框

参考MSDNDialogResult result MessageBox.Show("见过打劫的没?", "打、打、打劫", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);switch (result){case DialogResult.OK:MessageBox.Show("你按了确定…