您的位置:首页 > 其它

Erlang之基本数据

2012-06-16 22:24 211 查看
最近利用业余时间学习Erlang,学习书籍是Eralng程序设计,顺便记录下自己的学习笔记。

一周过去了,上周把环境搭好后,便零零散散的看了下其他书,今天刚好有时间,便继续学习。学习一个语言,首先还是先熟悉它的基本数据类型。

打开命令行,输入erl,进入到Erlangshell。

1.简单的整数运算。





真的很简单吧!!!

注意:

1. 1>表示命令行数从1开始

2. 你输入命令后,如果shell不响应,既有可能是忘记了加句点(.)回车去结束命令。新手需要特别注意。

3. 如果加了句点,出错的地方可能是你用单引号或者双引号开始一段文字,但是没有用相匹配的引号去结束它。

如果实在不行,直接crlt+c结束当前shell吧。


2.变量


如何把一个命令的结果保存起来呢?





首先,向变量X赋予一个值。然后shell打印了这个值。

输入X即可查看变量的值。

注意

1. Erlang的变量是单一赋值变量。第一次赋予值,就不能再改变它了。

如下图所示





当我们在试图给X赋予值,就会得到一个匹配失败的错误。什么叫匹配失败,请看下面。

2.模式匹配

在大多数语言中,=表示一个赋值操作,而在Erlang中表示一个模式匹配操作。Lhs= Rhs,对右端求值,然后将结果与左端Lhs进行模式匹配。

在命令1 ,第一次输入X,由于没有被赋值,因此可以讲值绑定到X上,同时shell就维护了这样一张绑定表{x |-> 6},在第三行时,在拿x与123绑定时,出现错误,因此匹配失败。

3.单一赋值的作用。

Erlang里面的变量仅是一个对值得一个引用,就具体实现而言,一个绑定变量就是一个指针,这个指针指向存放那个值的存储区。而那个是无法改变的。

Erlang中,变量一旦被赋值就不能再改变的特性还可以简化调试。

3.浮点数





"/"永远返回浮点数,div,rem分别对应整数除和取余数。

浮点数必须包含有小数 点且小数点后至少有一位十进制数。

4.原子

在Erlang中,原子用来表示不同的非数字常量值。

使用常量值常来增加代码可读性。

在java中,常量就是用关键字final修饰的,c++中是const,c基本是define。

原子是一串以小写字母开头,后跟数字字母或下划线或邮件符号。

例如:red,december,cat,joe@somehost,a_long_name等。

使用单引号引起来的字符也是原子。使用这种形式,就可以大写字母作为开 头或者包含非法数字字符

例如:'Monday','+'等。





5.元组

你若想将一定数量的项组成单一的实体,那么就可以使用元组。将若干以逗 号分割的值用一对花括号起来,就形成了一个元组。

例如:描述某个人的身高和值{joe,182}。

有点类似c语言的结构

struct Point

{ int x;

int y;

}P;

Erlang 并没有类型声明,因此创建一个"point"是这样

P = {10,45}

这条语句创建了一个元组并且将其绑定到变量P。元组中没有名字。因为 这个元组只包含了两个整数,所以我们必须记住其用处。

为了方便,我们可以使用一个原子作为元组的第一个元素来标明这个元组 所代表的意义。

例如:{point,10,45}

元组可以嵌套。

例如:





1.创建元组

在声明元组时,就自动创建了元组,不再使用它时,元组也随之销毁。Erlang使用垃圾搜集器去收回没有使用的内存,因此不必担心内存分配问题。

2.从元组中提取值

记住=符号在Erlang是模式匹配符。模式匹配是Erlang的基础,可以用它从数据结构中提取字段值,函数流程控制,筛选信息。

一个简单的例子:





声明一个元组,在将其与另一个元组匹配时,数组个数相同,并将10,45分别绑定到X,Y中。





命令5 将10绑定到C中没错,随后将45绑定到C时就错了,因为变量的值时不能改变的。

含有复杂的数据结构:





注意:_表示匿名变量

6 列表

我们用列表存储数目可变的东西,如在商店里买到的商品,行星的名字,从因式分解函数中返回的素数等。

例子:





术语:

列表的第一个元素称为列表的头。如果从列表中移除头,所剩下的东西就称为列表的尾。

例如:

列表[1,2,3,4,5],那么列表的头就是整数1,它的尾为[2,3,4,5]。

注意 : 列表的头可以是任何东西,但是列表的尾通常还是一个列表。

访问列表的头是一个非常高效的操作,因此,实际上所有的列表处理函数都是从提取列表头开始的,先对头进行处理,然后继续处理列表的尾。


定义列表

如果T是一个列表,那么[H|T]也是一个列表,这个列表以H为头,以T为尾。竖线符号(|)可以将列表的头和尾分隔开来,而[]则是空列表。

注意

当我们用[.....|T]来构造一个列表时,都应该保证T是一个列表。如果T是一个列表,那新的列表就是“正规形式”的,反之,新列表就被称为“非正规列表”。大多数的库函数都假定列表是正规的,他们不能正确处理非正规列表。






命令1 定义了一个列表。

命令2 用[....|T]来构造一个列表。同时也是一个正规列表

从列表中提取元素

利用模式匹配操作从一个列表中提取元素。

例如:现在有一个非空的列表L,那么表达式[X|Y] =L(X,Y都是自由变量),可以把列表的头提取到X,将列表的尾提取到Y。






命令3 通过模式匹配将列表ThingsToBuy1的头列表赋值给Buy1,尾列表为ThingsToBuy2

7 字符串

Erlang中并没有字符串,字符串实际上就是一个整数列表。用双引号("")将一串字符括起来就是一个字符 串。

注意

字符串中的字符是Latin-1(ISO-8859-1)编码的字符。

例如





命令1 用双引号表示一个字符串


命令2 表示的列表被原封不动的打印出来,这是因为1,2,3并不是可以打印的字符。

命令3 表示的列表,所有的项都是可以打印的字符,因此列表就打印成字符串的形式。

命令4 表达式基本与3相同,但列表的开始元素为1,并非可以打印字符,因此这个列表被原封不动打印。

Erlang所关心的只是以某种编码方式的编码的一串整数数值列表。如果碰巧是在Latin-1编码下,那么它们应该可以正确显示

最后附上Erlang程序设计上模式匹配基本表




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: