5

I have a list contains some elements and now with the help of lists:foreach I am fetching some more records and I want to append each value to my existing list elements without creating new variable as doing in other languages with help of array.

Here is my sample code which I am getting:

exception error: no match of right hand side value [6,7,1].

Sample Code:

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

I want output like,

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

2 回答 2

7

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

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]

于 2012-04-16T07:46:39.093 回答
1

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

于 2021-02-01T15:45:24.950 回答