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编程指南学习笔记,包含具体操作命令例子
NULL 博文链接:https://jias.iteye.com/blog/615679
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
erlang学习资料
NULL 博文链接:https://xiajs.iteye.com/blog/1871551
erlang学习3erlang学习3erlangerlang学erlang学习3习3学习3
Erlang学习资料,2本书,不用卖书,电子书足够了
erlang 程序设计一书的笔记,帮你快速重温erlang的知识点。
erlang学习2.pdferlang学习erlang学习2.erlang学习2.pdfpdf2.pdferlang学习2erlang学习2.pdf.pdf
erlang rebar 二进制
学习erlang 开发游戏利器 erlang学习文档 erlang学习工具
资源名称:Erlang语音学习资料汇总资源目录:【】Erlang程序设计【】[ManningPublications]ErlangandOTPinAction【】[NoStarchPress]LearnYouSomeErlangforGreatGood!ABeginner'sGuide【】[O'ReillyMedia]...
erlang学习4.pdferlang学习4.erlang学习4erlang学习4.pdf.pdfpdferlang学习4.pdf
本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...
erlang学习1.pdferlang学习erlang学erlang学习1.pdf习1.pdf1.pdf
用于erlang学习资源 一些基本的语言
erlang 连接学习例子 最简单的通讯例子
本书由Erlang之父Joe Armstrong编写,是毋庸置疑的经典著作。书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用...
erlang程序设计第二版习题答案 ,是我自己写的习题解答,也对照过网上的一些答案,相对来说是更加简洁和符合题意的解答,不过后面几章因为时间问题没有写完,有问题或者意见可以私信找我。