【问题标题】:How does Erlang list syntax [ a, b | [c, d] ] result in [ a, b, c, d]Erlang 如何列出语法 [ a, b | [c, d] ] 结果为 [ a, b, c, d]
【发布时间】:2015-02-03 07:28:24
【问题描述】:

我正在尝试关注: 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]] 

当然,我可以简单地记住语法的最终结果是什么,但我正在寻找更详细的解释。

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

    您可能对[Head|Tail] 结构感到困惑,它通常用于处理列表的头部元素,然后递归处理尾部元素。在这种情况下,您不能提取语法的b | [c,d] 部分,将其视为等同于[Head|Tail],然后得出[a,[b,c,d]] 的答案,因为b 不是列表的头部。

    【讨论】:

    • OK 你的第一段是一个很好的记忆方式。我认为刚刚单击的对我来说缺少的部分是列表中的, 运算符只是| [ ... ] 的语法糖。那是对的吗?我不太理解你的第二段,但语法糖解释对我来说很有意义。
    • 我想这是看待它的一种方式。 , 表示后面是另一个列表元素,而| 表示后面是列表尾。
    • 哦!我明白了,| 总是在最后,这使得[ a, b | [ c, d], e] 无效。
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多