UP | HOME

列表

Table of Contents

虽然元组可以将数据组成一组,但是也需要表示数据列表

Erlang 中的列表由 方括号 括起来表示。例如,世界上不同城市的温度列表就可以表示为:

[{moscow, {c, -10}}, {cape_town, {f, 70}}, {stockholm, {c, -4}},
 {paris, {f, 28}}, {london, {f, 36}}]

请注意:这个列表太长而没有放在一行中,但是这并没有什么关系

Erlang 允许在 “合理的地方” 换行,但是并不允许在一些 “不合理的方”,比如原子类型、整数、或者其它数据类型的中间

可以使用 | 查看部分列表:

11>  [First |TheRest] = [1,2,3,4,5]. 
 [First |TheRest] = [1,2,3,4,5]. 
[1,2,3,4,5]

12> First .
First .
1

13> TheRest . 
TheRest . 
[2,3,4,5]

这里用 | 将列表中的第一个元素与列表中其它元素分离开

First 值为 1,TheRest 的值为 [2,3,4,5]
20> [E1, E2 | R] = [1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]

21> E1.
1

22> E2.
2

23> R.
[3,4,5,6,7]
这个例子中,用 | 取得了列表中的前两个元素

如果要 取得的元素的数量超过了列表中元素的总数 ,将 返回错误 。请注意列表中特殊情况, 空列表 (没有元素),即 []

24> [A, B | C] = [1, 2].
[1,2]

25> A.
1

26> B.
2

27> C.
[]
在前面的例子中,用的是新的变量名而没有重复使用已有的变量名: First,TheRest,E1,R,A,B 或者 C

这是因为:在同一上下文环境下一个变量只能被赋值一次

计算列表长度

下面的例子中演示了如何获得一个列表的长度:

-module(list).

-export([list_length/1]).

list_length([]) ->
    0;    
list_length([First | Rest]) ->
    1 + list_length(Rest).

测试:

15> list:list_length([1,2,3,4,5,6,7]).
list:list_length([1,2,3,4,5,6,7]).

代码含义如下:

list_length([]) ->
    0;

空列表的长度显然为 0

list_length([First | Rest]) ->
    1 + list_length(Rest).

一个列表中包含第一个元素 First 与剩余元素列表 Rest, 所以列表长度为 Rest 列表的长度加上 1

这并不是尾递归,还有更好地实现该函数的方法 

一般地,Erlang 中元组类型承担其它语言中记录或者结构体类型的功能。列表是一个可变长容器,与其它语言中的链表功能相同

Erlang 中没有字符串类型。因为,在 Erlang 中字符串可以用 Unicode 字符的列表表示

这也隐含地说明了列表 [97,98,99] 等价于字符串 “abc”

Next:映射

Previous:原子类型

Home:顺序编程