Erlang Thursday – lists:seq

Erlang Thursday系列文章的下一个目标是详细描述那些与Ruby Tuesday系列文章里着重阐述的方法所相对应的Erlang函数。我希望通过每个星期与Ruby Tuesday配合的Erlang Thursday系列文章能使得读者渐渐不再对Erlang陌生;我也希望通过这种方式建立一个共同讨论的渠道来使得读者不再认为Erlang是令人生畏的一门语言。我很想知道您对我这个目标如何才能更好地让读者接受和理解的一些想法。

因为这周我在Ruby Tuesday里谈到了Ruby的Range方法,那么今天我要讲的Erlang函数就是lists:seq/2和lists:seq/3。

如果你还记得上周Erlang Thursday里的Erlang扫盲小知识里讲到的,在函数名字后面的数字表示是这个函数的arity,也就是入参的个数。

函数 lists:seq/2 接受两个整数入参,一个表示起始整数,一个表示结束整数,它产生一个包括这两个入参的整数列表。

1
2
3
4
lists:seq(1, 10).
% [1,2,3,4,5,6,7,8,9,10]
lists:seq(1, 1).
% [1]

有三个入参的lists:seq函数引入一个增量作为第三个参数:

1
2
lists:seq(1, 10, 3).
% [1,4,7,10]

这个增量值可以是负数,这样就允许从一个整数减少低至另一个整数。

1
2
3
4
lists:seq(20, 10, -1).
% [20,19,18,17,16,15,14,13,12,11,10]
lists:seq(20, 10, -5).
% [20,15,10]

如果给了不合适的起始和结束入参,lists:seq 函数不像Rang Range那样返回一个空集合,它会抛出一个异常。

1
2
3
4
5
6
7
8
9
10
11
lists:seq(10, 1).
% ** exception error: no function clause matching lists:seq(10,1) (lists.erl, line 241)
lists:seq(1, 10, 0).
% ** exception error: no true branch found when evaluating an if expression
% in function lists:seq/3 (lists.erl, line 262)
lists:seq(1, 10, -2).
% ** exception error: no true branch found when evaluating an if expression
% in function lists:seq/3 (lists.erl, line 262)
lists:seq(10, 1, 2).
% ** exception error: no true branch found when evaluating an if expression
% in function lists:seq/3 (lists.erl, line 262)

原文链接: https://www.proctor-it.com/erlang-thursday-lists-seq/