如何在不在erlang中创建新变量的情况下将元素添加到现有列表?

时间:2012-04-16 06:13:23

标签: list foreach erlang append

我有一个包含一些元素的列表,现在有了list的帮助:foreach我正在获取更多记录,我想将每个值附加到我现有的列表元素而不创建新变量,就像在其他语言中使用数组一样。我是erlang的新手,请有人帮我解决这个问题。这是我的示例代码,我得到了... 异常错误:右侧值不匹配[6,7,1]。

示例代码:

listappend() ->
    A = [1,2,3,4,5],
    B = [6,7],
    lists:foreach(fun (ListA) ->
        B = lists:append(B, [ListA])                       
        end, A),
    B.

我想要输出,

B = [6,7,1,2,3,4,5].

由于

2 个答案:

答案 0 :(得分:4)

首先,此功能已存在,因此您无需自行实施。实际上,列表可以将两个列表作为参数:

1> lists:append([1,2,3,4,5], [6,7]).
[1,2,3,4,5,6,7]

实际上实现为:

2> [1,2,3,4,5] ++ [6,7]. 
[1,2,3,4,5,6,7]

请记住++运算符将复制左操作数,因此此操作很容易导致二次复杂度。说,您可能想使用“cons”运算符构建列表(最终在计算结束时反转列表):

3> [1|[2,3,4,5,6,7]].
[1,2,3,4,5,6,7]

在任何情况下,你的函数中都可以有两个参数,它们是要追加的两个列表,而不是在函数体中定义它们。这样,每次调用my_append/2函数时,A和B的值都会改变。

my_append(A, B) ->
  YOUR_CODE_GOES_HERE

作为一个注释,关于你得到的实际错误,这是由于以下行:

B = lists:append(B, [ListA])

在每次迭代期间,您将新值绑定到变量B,该变量已绑定到值[6,7]

答案 1 :(得分:0)

Erlang 中的变量是不可变的。这意味着一旦绑定了变量,您就无法为其分配新值,这就是您收到“不匹配”错误的原因。旧值与您尝试分配给变量的新值不匹配。相反,您可以使用例如基于旧列表的 list:append 创建一个新列表。您可能应该首先了解递归以及如何使用它来操作列表。