Erlang如何列出语法[a,b | [c,d]]导致[a,b,c,d]

时间:2015-02-02 22:20:50

标签: erlang

我试图遵循: http://learnyousomeerlang.com/starting-out-for-real

有一节展示了几个等效的列表结构:

  

有时可以构建Erlang列表的方式   让那些不习惯类似建设者的人感到困惑。帮助   你熟悉这个概念,阅读所有这些例子(提示:   他们都是等同的):

[a, b, c, d]
[a, b, c, d | []]
[a, b | [c, d]] <---- I don't understand this one
[a, b | [c | [d]]]
[a | [b | [c | [d]]]]
[a | [b | [c | [d | [] ]]]]

我不明白的是:

[a, b | [c, d]] 

我理解正常的嵌套构造函数语法,它只是一个递归构造的列表。但是erlang如何处理这种非嵌套的术语语法?我原本期望评估b | [c, d]会导致[b, c, d]导致:

[a, [b , c, d]] 

当然,我只记得语法的最终结果是什么,但我正在寻找更详细的解释。

1 个答案:

答案 0 :(得分:4)

构造| [c,d]使[c,d]成为封闭列表的尾部。在a,b分隔符之前的封闭列表中有多少像|这样的元素并不重要,因为它们只是该封闭列表的正常元素。换句话说,|将列表尾部的列表元素从其右侧分隔开来。

也许你对构造[Head|Tail]感到困惑,它通常用于处理列表的head元素,然后递归处理尾部。在这种情况下,您无法提取语法的b | [c,d]部分,将其视为等同于[Head|Tail],然后结束[a,[b,c,d]]的答案,因为b不是列表的负责人。