Erlang入门教程 - 5. 列表

racaljkracaljk

鉴于已经有tuple将元素分组,现在也需要一个工具表示一列元素。Erlang中列表由方括号“[” “]”表示。比如要表示世界各城市的温度可以:

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

注意如果列表太长一行没法写完,没关系,Erlang允许我们在合理的地方换行。

在列表中获取一部分可以使用“|”,下面例子是最好的解释:

17> [First |TheRest] = [1,2,3,4,5].
[1,2,3,4,5]
18> First.
1
19> 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]

在这里可以看到使用“|”获取列表的头两个元素。如果你尝试获取更多元素,就会返回一个错误。注意列表没有元素这个特殊情况,“[]”:

[1,2]
25> A.
1
26> B.
2
27> C.
[]

在上面的例子中,使用的是新变量名而不是复用之前的变量名:First,TheRest,E1,E2,R,A,B,C。这是因为一个变量名在相同作用域内只能绑定一次值。关于这点后面讨论。

下面的例子显示了如何获取列表的长度。在tut4.erl中输入下面代码:

-module(tut4).

-export([list_length/1]).

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

编译并测试:

28> c(tut4).
{ok,tut4}

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

解释:

list_length([]) ->
    0;

一个空列表的长度显然是0。

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

包含第一个元素First和剩余元素Rest的列表的长度是1 + Rest长度
(致高级读者:这不是尾递归,关于这个函数有一个更好的实现)

通常,tuple用于其它语言的“record”或者“struct”所用的地方。列表用于表示大小变化的事物,即用于其它语言的链表所用的地方。

Erlang没有字符串类型。作为代替,字符串可以表示为Unicode字符列表。这意味着例如列表[97,98,99]等价于“abc”。Erlang shell“机智”的猜测你给的列表的意思,并给出它认为最合适的构型的输出,比如:

30> [97,98,99].
"abc"
文章被以下专栏收录
还没有评论
推荐阅读