Erlang 学习笔记(二)
guibin.beijing@gmail.com
1.5 Erlang的数据类型
变量(variables):
从
Erlang 学习笔记(一)中的代码中的double函数定义发现,其参数为X,而且是大写的,这就是Erlang对变量定义的要求。
Erlang中变量必须以大写字母开头,比如Number,ShoeSize,Age等。如果不是以大写字母开头,编译时会报错。
Atoms:
Erlang中另外一种数据类型叫Atoms。Atoms以小写字母开头,仅仅表示名字而已,没有其他意义,变量可以存储数据,而Atoms则不能存值数据。比如tut2中
引用
-module(tut2).
-export([convert/2]).
convert(M, inch) ->
M / 2.54;
convert(N, centimeter) ->
N * 2.54.
convert函数将英寸和厘米相互转换。在这个convert函数定义中使用的"inch"和"centimeter"就是Atoms,M和N是变量。Atoms在这里相当于用来区分两个函数的用途,起到标记的作用。
在convert inch的定义结束时,使用了";"而不是".",这表示分号之后还有属于该函数的代码。
编译和运行结果如下:
引用
5> c(tut2).
{ok,tut2}
6> tut2:convert(20, inch).
7.874015748031496
7> tut2:convert(20, centimeter).
50.8
元组(Tuples):
Erlang使用Tuple将一组相关的数据放在一起,使得更易于理解。Tuple用大括号“{}”将元素包围起来。回忆一下,Scala中也有Tuple,其意义和Erlang的一样,区别是使用小括号“()”。
比如tut3:
引用
-module(tut3).
-export([convert_length/1]).
convert_length({centimeter, X}) ->
{inch, X / 2.54};
convert_length({inch, Y}) ->
{centimeter, Y * 2.54}.
编译和运行结果如下:
引用
10> tut2:convert(20, inch).
7.874015748031496
11> tut2:convert(20, centimeter).
50.8
12> tut3:convert_length({inch, 20}).
{centimeter,50.8}
13> tut3:convert_length({centimeter, 20}).
{inch,7.874015748031496}
14> tut3:convert_length(tut3:convert_length({centimeter, 20})).
{centimeter,20.0}
注意上面14行是如何工作的,首先将20厘米转换成英寸,然后在转换回厘米,结果还是原来的20厘米。函数的返回值作为外层函数的输入参数。
截止目前为止,我们看到的元组都只有两部分,实际上元组可以有任一多部分组成。比如:
引用
{moscow, {c, -10}}
{cape_town, {f, 70}}
{paris, {f, 28}}
列表(Lists):
列表就是用“[]”将多个元素括起来,元素之间用逗号“,”隔开。比如:
引用
[{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}}, {paris, {f, 28}},
{london, {f, 36}}]
List一般如果比较长,一行写不下的话,则Erlang允许将代码在任何“合理”的地方断开,比如,只要不在atoms,integers等中间断开就可以。
另外可以使用"|"来查找List中特定位置上的元素,请看如下的例子:
引用
20> [First | Rest] = [1, 2, 3, 4].
[1,2,3,4]
21> First.
1
22> Rest.
[2,3,4]
这和Scala中的模式匹配非常类似。First匹配上了第一个元素,剩余的全部元素匹配给Rest。
引用
23> [First2, Second2 | Rest2] = [1, 2, 3, 4, 5, 6, 7, 8].
[1,2,3,4,5,6,7,8]
24> First2.
1
25> Second2.
2
26> Rest2.
[3,4,5,6,7,8]
27>
使用"|"获取List中前两个元素,剩余的赋给"|"后面的元素。如果List长度比要匹配的少一个,则返回空List。比如:
引用
4> [One, Two, Three | Last] = [1, 2, 3].
[1,2,3]
5> Last.
[]
6> Three.
3
如果List的长度比要匹配的少多个,则会抛异常:
引用
5> [One, Two, Three | Last] = [1, 2].
** exception error: no match of right hand side value [1,2]
看一个使用List的综合例子。该例子list_length获取List的长度:
引用
-module(tut4).
-export([list_length/1]).
list_length([]) ->
0;
list_length([First | Rest]) ->
1 + list_length(Rest).
编译和运行:
引用
10> c(tut4).
./tut4.erl:6: Warning: variable 'First' is unused
{ok,tut4}
11> tut4:list_length([]).
0
12> tut4:list_length([1, 2, 3, 4]).
4
13> tut4:list_length(["Hello", "Hi"]).
2
看到编译时提示的警告,说First定义了但是没有使用,跟Scala一样,我们可以用占位符“_”代替First,然后再次编译运行就没问题了。代码如下:
引用
-module(tut4).
-export([list_length/1]).
list_length([]) ->
0;
list_length([_ | Rest]) ->
1 + list_length(Rest).
字符串(String):
Erlang没有String数据类型,而字符串可以给ASCII码代替。因此[97, 98, 99]和“abc”相等。比如:
引用
23> [97, 98, 99].
"abc"
Guibin
分享到:
相关推荐
【标题】"Erlang 学习笔记1" 在深入探讨Erlang这一强大的并发编程语言之前,我们先来理解一下Erlang的基本概念。Erlang是由瑞典电信设备制造商Ericsson开发的一种函数式编程语言,它最初设计的目的是为了处理分布式...
### Erlang学习笔记:深入解析Erlang编程与系统管理 #### 1. Erlang编程基础与资源 在深入探讨Erlang编程之前,我们首先需要了解一些基础资源和学习资料。Erlang官方网站([www.erlang.org](http://www.erlang.org...
学习Scala,你需要理解其静态类型的特性、模式匹配、 Actors模型以及类型系统,包括高阶函数、特质(traits)和不可变数据结构。 Groovy是另一种基于JVM的动态编程语言,它的语法简洁,易于阅读和编写。Groovy与...
本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...
这些是我在学习过程中关于 Erlang 的笔记和主要引用。 检查部分以查看我从哪里获取报价。 请注意,此 repo 始终在进行中。 (我还没找到时间完成这本书。) 话题 陷阱 erlang 没有null值这样的东西 每个函数都需要...
**RabbitMQ学习笔记与软件插件详解** RabbitMQ是一种广泛应用的消息中间件,它基于AMQP(Advanced Message Queuing Protocol)协议,提供可靠的消息传递服务。在分布式系统中,RabbitMQ扮演着数据交换中心的角色,...
本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...
在这个“rabbitmq学习笔记.zip”压缩包中,我们可以期待找到一系列关于RabbitMQ的核心概念、安装教程、使用方法以及常见问题的详细说明。 首先,RabbitMQ的基本概念包括生产者(Producer)、消费者(Consumer)、...
在本篇学习笔记中,我们将首先了解RabbitMQ的安装过程。 1. **Erlang的安装**: Erlang是RabbitMQ的基础,因为RabbitMQ是用Erlang编写的。安装Erlang可以通过以下命令完成: ```bash sudo apt-get install ...
Erlang程序设计的书籍是学习这门语言的重要资源。《Erlang程序设计(第2版)》便是一本面向初学者的经典教材,提供了丰富的基础知识和深入的讨论,对理解和掌握Erlang语言有极大帮助。 对于Erlang的安装,目前有...
在Windows环境下,可以通过下载并编译源代码,或者使用预编译的二进制包进行安装。对于开发者来说,官方文档(redis.io)和社区资源(如GitHub上的微软存档项目)是获取帮助和教程的重要来源。 总之,Redis作为...
### RabbitMQ 学习笔记知识点总结 #### 一、RabbitMQ 历史与背景 RabbitMQ 是一个基于 AMQP(高级消息队列协议)的开源消息中间件,由 Erlang 语言编写而成。AMQP 的出现填补了异步消息处理领域的标准化空白,特别...
本篇学习笔记汇总了XMPP的基本概念以及多种编程语言下的客户端库介绍,旨在帮助读者快速了解并上手XMPP技术。XMPP作为一种强大的即时通讯协议,不仅具备高度的可扩展性,还支持多种编程语言。这使得开发者可以根据...
这个“RabbittMQ软件,资料及笔记”压缩包可能包含了一系列关于RabbitMQ的学习资源,包括文档、教程、笔记等,旨在帮助用户深入理解和熟练掌握这一强大的中间件。 首先,让我们来了解一下RabbitMQ的核心概念和功能...
Redis(Remote Dictionary Server ),即远程字典...《狂神说Redis笔记》主要是狂神说发的笔记,通俗易懂,从入门到主从和实践,对Redis有一个很好的学习,通过本教程你可以一步一步了解 Redis 的应用,感兴趣的可以下载
【RabbitMQ学习讲义】 RabbitMQ是一个开源的消息队列系统,它基于高级消息队列协议(AMQP)实现,旨在提供可靠的、跨平台的消息传递。AMQP是一种应用程序层的开放标准,允许不同的系统、语言和应用之间进行无缝的...
【描述】"帖子" 提示我们这个项目可能包含了一系列的文章或博客帖子,这些帖子可能涵盖了Erlang语言的学习笔记、EVM的内部工作原理、如何使用Erlang进行并发编程、Erlang在分布式系统中的应用,以及与SCSS(Sassy ...
综上所述,通过本篇笔记的学习,读者可以全面掌握RabbitMQ的基本使用方法以及一些高级特性,这对于实际项目中的消息处理需求提供了强有力的支持。无论是简单的消息传输还是复杂的分布式系统架构设计,RabbitMQ都能...
选择RabbitMQ的理由包括其对AMQP标准的全面支持,提供高度可靠的消息持久化功能,以及强大的高并发处理能力,这得益于Erlang语言的天然优势。此外,RabbitMQ的集群部署简单,社区活跃,使得它成为许多企业的首选。 ...
这些笔记可能以PDF或Markdown格式存在,为学生提供了学习的核心资源,帮助他们消化和回顾课堂讲解的内容。 “所有作业”这部分内容可能涉及到一系列编程练习,旨在让学员实践所学知识。作业可能涵盖用Erlang或其他...