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

Aja*_*y V 5 erlang foreach list append

我有一个包含一些元素的列表,现在在lists:foreach我获取更多记录的帮助下,我想将每个值附加到我现有的列表元素中,而无需像在其他语言中那样借助数组创建新变量。

这是我得到的示例代码:

exception error: no match of right hand side value [6,7,1].
Run Code Online (Sandbox Code Playgroud)

示例代码:

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

我想要输出,

B = [6,7,1,2,3,4,5].
Run Code Online (Sandbox Code Playgroud)

Rob*_*loi 6

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

1> lists:append([1,2,3,4,5], [6,7]).
[1,2,3,4,5,6,7]
Run Code Online (Sandbox Code Playgroud)

它实际上是这样实现的:

2> [1,2,3,4,5] ++ [6,7]. 
[1,2,3,4,5,6,7]
Run Code Online (Sandbox Code Playgroud)

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

3> [1|[2,3,4,5,6,7]].
[1,2,3,4,5,6,7]
Run Code Online (Sandbox Code Playgroud)

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

my_append(A, B) ->
  YOUR_CODE_GOES_HERE
Run Code Online (Sandbox Code Playgroud)

请注意,关于您收到的实际错误,这是由于以下行:

B = lists:append(B, [ListA])
Run Code Online (Sandbox Code Playgroud)

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