首页  »  函数式编程

erlang印象初步

关键字:面向并发编程、函数式编程、高性能、适用有超大型并发需求的系统。

Erlang又一种古老的东西被翻炒,目前来讲也是渐渐热起来了。其实Erlang的确是个好东西,一直被用在电信行业的编程语言在现在受关注的原因其中一个可能是现代计算机的进化,多核计算机的出现,面向并发编程语言的优势也一下子体现出来了。

由于之前对函数式编程(Functional programing)有了解,俺搞过Haskell滴,还有Python天生的对FP的支持(其实说不上是FP,仅仅是函数也是对象,可以作参数传递罢了),目前很容易接受Erlang所声明的那一些好处:无共享的进程、进程间靠消息进行通讯、变量不可变、无副作用的函数式编程、调试容易、热部署。

学习Erlang,需要学习的东西不见得比学习当前流行的语言多。天生语言级别的并发编程机制减免了去学习所谓的多线程、锁、等待等等这些东西,而且在“顺序化”的编程语言(如Java,C,Python,Ruby)里面的东西,Erlang里面只有几种:变量,相当于我们说的常量;if语句;case语句。想要循环?不好意思,没有,你自己写个高阶函数来实现吧,很简单。

Erlang的基本数据类型有整型、浮点型、原子型、引用、二进制数、Pid、端口、匿名函数。复合数据类型只有元组及列表。列表可以想象成一个数组,元组是一个不可变的列表。且慢。。那没有字符串吗?呃。。[83,117,114,112,114,105,115,101]. 这一串东西其实就是"Surprise",字符串相当于一个字符列表(跟C的概念有点类似)。这些数据类型,需要去适应的是原子型和匿名函数(如果你不熟悉FP),还有就是另一个概念:模式与项的匹配。在Erlang的世界里,等号不是简单的赋值符号,而是代配着一种匹配,简单地理解等号左边的是模式、右边的是项。尝试一下去看下面一些匹配,很容易明白。当然你硬要认为这是赋值,那其实也有一点成立,但这不是全部(赋值发生在匹配成功的时候):

Pattern                                 Term                                                        Result
{X,abc}                                  {123,abc}                                                Succeeds X → 123
{X,Y,Z}                                   {222,def,"cat"}                                       Succeeds X → 222, Y → def,Z → "cat"
{X,Y}                                      {333,ghi,"cat"}                                        Fails—the tuples have different shapesX true Succeeds X → true
{X,Y,X}                                  {{abc,12},42,{abc,12}}                           Succeeds X → {abc,12}, Y → 42
{X,Y,X}                                  {{abc,12},42,true}                                   Fails—X cannot be both {abc,12} and true
[H|T]                                     [1,2,3,4,5]                                                Succeeds H → 1, T → [2,3,4,5]
[H|T]                                     "cat"                                                          Succeeds H → 99, T → "at"
[A,B,C|T]                              [a,b,c,d,e,f]                                               Succeeds A → a, B → b,C → c, T → [d,e,f]

如果不明白或不相信,在Erlang的Shell里面以Pattern = Term这样的方式尝试下上面的情况吧。该例子摘自《Programing Erlang》原文41页。

值得一提的是列表这种数据类型,例子当中看到[H|T]的其实是代表一个列表,[]是一个空列表,H代表列表第一个元素,就是头,Head,除了第一个元素以外的都属于尾(Tail),也是一个列表,就是说[a,b,c,d]其实是[a[b[c[d]]]]。这样定义的原因是Erlang从列表里面找到第一个元素的速度是最快的,这样的结构在编写高阶函数或者递归的时候好处不言自喻。

元组和原子类弄用来表达结构化的数据是个不错的选择:

jeff = {people,{name,jeff},{sex,boy},{height,185}}

这一切也许都让你摸不着头脑。但是,如果你有兴趣去了解,相信很快你会很喜欢,并且有很多没见过的东西等着你去挖掘。当然,前提是你有兴趣,有时间,有耐心,有决心。have fun!

 

Meta

关于本博客...

关于黑莓手机、apple、twitter、互联网、web2.0以及生活的碎言碎语。请在twitter上 follow我,欢迎同好者talk to me bbmyth AT gmail.com。博客Hosting在 webfaction。

赞助商链接

我看我听我读

最新评论

标签

python 空间 开发 计划 年假 工作 诗歌 音乐 西片 恐怖 惊变 django mysql rss 文艺片 太阳 彩色 电影 apache 部署 factcgi lighttpd javascript editor MYMeditor sql 日志 java hibernate orm 数据库 英伦 摇滚 原创 中间件 朋友 erlang 并发 函数式编程 旅游 云南 丽江 发呆 学习 编程 技术 lucene 全文搜索 中文分词 乐队 模板 分页 成功 google pagerank 中文 更新 个性化 秋天 互联网 web ext json ajax 事业 职业 读书 开源 香港 澳门 忧郁 冬天 compass dvd 广州 地下 暴力 美学 声音玩具 独立 备份 数据 琐事 博客 生活 体验 卖唱 接口 设计模式 图表 wiki moin 遇窃 air ria 需求 设计 信息 健康 感悟 人生 真诚 life jquery 杭州 灾害 2008 中国 灾难 哀悼日 jmesa grails flex flash 捐赠 scrum 软件过程 快速开发 plone cms nuexo zope 左小诅咒 demo prototpye AMF actionscript 汉诺塔 算法 递归 结婚 感情 opensource 网络 beautifulSoup 管理 大理 香格里拉 休假 鼻炎 许巍 感性 2009 随想 cpug 聚会 出差 北京 api 创业 商城 blackberry 手机 TD 交流 处事 为人 房子 经济 手机仿真 在线服务 嵌入式 海鲜 p2p easymule apple 技巧 thing gtd task gfw vpn 穿墙 代理 软件管理 翻译 mac 英语 caffeine 休眠 搬家 主机 prism firefox mozilla 免费 php codeigniter url blogspot mindmap mindnode htmlparse easyurl 产品 黑莓 rim 试手机 豆瓣 twitter 微博 杂记 时空 亲人 dabr webfaction host 快速查看 safari appale 桌面 snow 升级 leopard finder 权限 glims python主机 合租 ruby主机 快捷键 itunes 时间管理 原型 画图 招聘 hosting 写作 软件 家庭 广州技术沙龙 postgres 云计算 fuckgfw 内容审检 谷歌 chrome linux odbc database freetds R 统计 书签 浏览器 bookmark tinymce 文件管理 分享 忙碌 旅行 马来西亚 图维导图 freemind 工具 pinax develope shell dropbox barcamp

日志分类

友情链接

博客归档

PowerBy