为什么以下两个可以创建列表的表达式在Erlang中返回不同的结果?
> ["A" | []]
// returns ["A"]
> [[] | "A"]
// returns [[], 65]
我期待第二个表达式返回与第一个表达式相同的结果。谁能解释为什么会这样呢?
答案 0 :(得分:8)
要正确理解其工作原理,请记住所有这些表达式都遵循以下模式:
[head | tail]
其中head
是单个元素,tail是另一个列表。
另请注意,字符串是字符列表,即"A"
实际上等于[65]
。
因此,在第一种情况下,会创建一个头部为"A"
且尾部为[]
的列表,并按预期将其转换为["A"]
。
但是,在第二种情况下,头部为[]
,尾部为"A"
,等于[65]
。因此,结果是head元素([]
)加上尾部的所有元素(65
)。
答案 1 :(得分:2)
我不明白为什么他们应该是一样的。您可能认为[A|B]
连接了A
和B
列表,但它没有:它意味着将元素 A
添加到 list B
。
["A" | []]
是一个有序对,其第一个元素为"A"
,第二个元素为[]
,对应于"A"
作为单个元素的列表。< / p>
[[] | "A"]
是一个有序对,[]
为第一个元素,"A"
为第二个元素;因为字符串实际上是Erlang中的ASCII代码列表,这意味着它与包含[]
和65
(ASCII A
)的列表相同。因为列表的第一个元素本身就是一个列表,所以这是一个嵌套列表。