Erlang之基本数据

来源:互联网 发布:2017abb机器人编程视频 编辑:程序博客网 时间:2024/06/04 19:55

                 最近利用业余时间学习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程序设计上模式匹配基本表


原创粉丝点击