Erlang列表创建

时间:2012-02-28 14:23:36

标签: list erlang

为什么以下两个可以创建列表的表达式在Erlang中返回不同的结果?

> ["A" | []]
// returns ["A"]
> [[] | "A"]
// returns [[], 65]

我期待第二个表达式返回与第一个表达式相同的结果。谁能解释为什么会这样呢?

2 个答案:

答案 0 :(得分:8)

要正确理解其工作原理,请记住所有这些表达式都遵循以下模式:

[head | tail]

其中head是单个元素,tail是另一个列表。

另请注意,字符串是字符列表,即"A"实际上等于[65]

因此,在第一种情况下,会创建一个头部为"A"且尾部为[]的列表,并按预期将其转换为["A"]

但是,在第二种情况下,头部为[],尾部为"A",等于[65]。因此,结果是head元素([])加上尾部的所有元素(65)。

答案 1 :(得分:2)

我不明白为什么他们应该是一样的。您可能认为[A|B]连接了AB列表,但它没有:它意味着将元素 A添加到 list B

["A" | []]是一个有序对,其第一个元素为"A",第二个元素为[],对应于"A"作为单个元素的列表。< / p>

[[] | "A"]是一个有序对,[]为第一个元素,"A"为第二个元素;因为字符串实际上是Erlang中的ASCII代码列表,这意味着它与包含[]65(ASCII A)的列表相同。因为列表的第一个元素本身就是一个列表,所以这是一个嵌套列表。