我试图遵循: 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]]
当然,我只记得语法的最终结果是什么,但我正在寻找更详细的解释。
答案 0 :(得分:4)
构造| [c,d]
使[c,d]
成为封闭列表的尾部。在a,b
分隔符之前的封闭列表中有多少像|
这样的元素并不重要,因为它们只是该封闭列表的正常元素。换句话说,|
将列表尾部的列表元素从其右侧分隔开来。
也许你对构造[Head|Tail]
感到困惑,它通常用于处理列表的head元素,然后递归处理尾部。在这种情况下,您无法提取语法的b | [c,d]
部分,将其视为等同于[Head|Tail]
,然后结束[a,[b,c,d]]
的答案,因为b
不是列表的负责人。