商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
信箱 E杂志
您的位置:首页 > 技术频道 > 正文

erlang印象初步

作者:来自ITPUB论坛  2008-01-30

  【IT168 技术文档】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!

1
【内容导航】
第1页: erlang印象初步
©版权所有。未经许可,不得转载。
[责任编辑:cynthia]