【问题标题】:How to add element to existing list without creating new variable in erlang?如何在不在erlang中创建新变量的情况下将元素添加到现有列表?
【发布时间】:2012-04-27 12:09:17
【问题描述】:

我有一个包含一些元素的列表,现在在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].

【问题讨论】:

  • 其实我想做动态之类的,我不知道列表 A 中有多少元素。我将创建多少新变量以及我如何知道在循环中创建了多少变量以及什么是我必须显示的最后一个变量吗?请帮忙...
  • 您无法添加到现有列表。不变性阻止了这一点。 Read here
  • 谢谢 Gert...但是有没有其他方法可以实现这个...
  • Ajay,您需要使用不同的变量:B1 = B ++ A。一旦 B 已经绑定到列表,就无法将其重新绑定到不同的值 [6,7] .
  • lists:foreach/2 实际上不用于列表操作。它用于产生副作用的功能,例如 I/O 或消息传递。列表操作应该没有副作用。 lists 模块为无副作用的列表操作提供了其他功能,例如 append/2、map/2 和 foldl/3 等等。

标签: list foreach erlang append


【解决方案1】:

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

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]

【讨论】:

  • 是的罗伯托,我明白了,但我的要求只是这样,我想做动态的,我不知道列表 A 中有多少元素。基于循环我有多少新变量将创建,我必须显示的最后一个变量是什么?这是我面临的实际问题。请帮忙...
  • 我只想要 B 中的上述输出...如何在 Erlang 中实现
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多