什么是[... || ...< - ...]在这段代码中做什么?

时间:2013-03-20 14:29:12

标签: erlang

我再次需要你的帮助,我正在努力理解这段erlang代码。

Line="This is cool".
Lines = [Line || _Count <- lists:seq(1,5)].

输出

["This is cool","This is cool","This is cool","This is cool","This is cool"]

我不明白它背后打印所需次数的逻辑。 Line || _*****的含义是什么?

3 个答案:

答案 0 :(得分:2)

由于Line的值未在列表推导的右侧更改,因此每个元素的值相同,即Line的值。

列表理解的右侧只是确定元素的数量。

答案 1 :(得分:2)

看看这段代码:

Line = "This is cool".
Lines = [{Line, Count} || Count <- lists:seq(1, 5)].

在这里,您可以创建一个大小为2的元组列表,其中第一个元素是常量,第二个元素是从列表推导的源列表中获取的。如果从元组中删除元素,它将不会更改列表的结构。

答案 2 :(得分:0)

它可以这样读: NewListe = [Dosomething ||元素&lt; - 听力

以这种方式创建一个NewListe:对于每个Liste元素,使用Dosomething构建一个新元素。

一步一步地给出了Liste = list:seq(1,5)= [1,2,3,4,5];

对于每个元素,只丢弃元素的值(这就是为什么它被写为_Count)和

Dosomething只发回价值&#34;这很酷&#34;,

,结果是5次&#34;这很酷&#34;

的列表

[&#34;这很酷&#34;,&#34;这很酷&#34;,&#34;这很酷&#34;,&#34;这很酷&#34;,&# 34;这很酷&#34;]

&lt; - 被称为发电机;签到后||你可能有发电机或过滤器。例如,如果我们想象您有一个不同元素的列表,并且想要只获得可打印的列表项,则转为大写,您将需要一个生成器:

  

X&lt; - &#34; toto&#34;,5,&#34; Hello&#34;,atom] 获取每个元素

过滤器:

  

io_lib:printable_list(X)仅选择可打印列表

和转型:

  

string:to_upper(X)转为大写

所有人都有你的期望:

1> [string:to_upper(X) || X <- ["toto",5,"Hello",atom], io_lib:printable_list(X)].
["TOTO","HELLO"]
2>