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

List 如何将元素添加到现有列表中而不在erlang中创建新变量?,list,foreach,erlang,append,List,Foreach,Erlang,Append,我有一个包含一些元素的列表,现在在lists:foreach的帮助下,我正在获取更多的记录,我想将每个值附加到我现有的列表元素中,而无需像在其他语言中那样借助数组创建新变量 下面是我得到的示例代码: exception error: no match of right hand side value [6,7,1]. 示例代码: listappend() -> A = [1,2,3,4,5], B = [6,7], lists:foreach(fun (ListA

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

下面是我得到的示例代码:

exception error: no match of right hand side value [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].

首先,这个特性已经存在,所以您不需要自己实现它。事实上,该列表可以将两个列表作为参数:

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”操作符构造列表(最终在计算结束时反转列表):

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

my_append(A, B) ->
  YOUR_CODE_GOES_HERE
请注意,关于您得到的实际错误,这是由于以下几行造成的:

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

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

Erlang中的变量是不可变的。这意味着一旦变量被绑定,就不能将新值赋给它,这就是为什么会出现“不匹配”错误的原因。旧值与您试图分配给变量的新值不匹配。相反,您可以在旧列表的基础上使用例如lists:append创建新列表。你可能应该先看看递归,以及如何使用它来操作列表。

实际上我想让它成为动态的,比如,我不知道列表A中有多少元素。我将创建多少新变量,我如何知道在循环中创建了多少变量,我必须显示的最后一个变量是什么?请帮助…您无法添加到现有列表。不变性防止了这种情况。谢谢Gert…但是有没有其他方法可以实现这一点…啊,你需要使用不同的变量:B1=B++a。一旦B已经绑定到列表[6,7],就没有办法将B重新绑定到不同的值。列表:foreach/2实际上不用于列表操作。它用于产生副作用的函数,如I/O或消息传递。列表操作应该没有副作用。列表模块为无副作用的列表操作提供了其他功能,如append/2、map/2和foldl/3以及其他许多功能。是的,Roberto,我知道了,但我的要求是这样的,我想做动态的like,我不知道列表A中有多少个元素。根据循环,我将创建多少个新变量,我必须显示的最后一个变量是什么?这是我面临的实际问题。请帮助…我只想在B以上的输出…如何在Erlang是可能的
B = lists:append(B, [ListA])