【问题标题】:Erlang add element to same listErlang将元素添加到同一个列表
【发布时间】:2012-04-23 18:28:29
【问题描述】:

Erlang 将元素添加到同一个列表?在erlang中可以吗?如果没有,那么请帮助我使用任何替代解决方案来实现这一目标。

我必须做的实际要求如下:

我有多个列表 ID,因此基于列表 ID,我必须将状态不等于“B”、“U”(退回和取消订阅)的所有订阅者电子邮件 ID 提取到 1 个列表中,然后我必须删除来自该 listSubscribers 的重复电子邮件 ID,一旦我获得了正确的 ListSubscriber,我将循环它并向所有唯一订阅者发送电子邮件。当我第一次获得订阅者时,将其循环到列表以获取所有订阅者时,问题就出现了 当循环进入第二个并获取订阅者时,它将添加到同一个列表中,抛出错误 bcoz list is already bound。

示例代码我在做什么......

% I have multiple list it can be any number, So by loop through each list id fetching subscribers.

lists:foreach( fun (ListId) -> 

ListSubscribers = emailmarketing:get_list_subscribers(ListId), %% Here I am fetching All email subscriber Ids...

io:fwrite("Total Subscriber from this list -> ~p ~n", [ListSubscribers])

end, ListIds),

UniqueSubscriberList = lists:usort(ListSubscribers),

%% Now I'll loop here and send each subscriber campaign email.

谢谢!

【问题讨论】:

  • 就像@sch 所说的以及您在上一个问题中发布的内容一样,您必须创建一个新变量并将lists::append() 的返回值分配给该新变量。
  • Ajay,函数式语言编程与 Java、Python、JavaScript 等命令式语言编程有很大不同。在 Erlang 中,数据结构是不可变的,变量只能绑定一次,有没有内置的循环结构。这是一种与您可能习惯的语言截然不同的语言。

标签: list erlang element


【解决方案1】:

请注意,Erlang 是一种函数式编程语言。它与 C 或 PHP 等命令式语言非常不同。编写 Erlang 需要对函数式编程有基本的了解,包括单一赋值、递归、高阶函数,还可能需要列表推导。

列表推导在您的场景中非常有用。我认为您尝试做的很多事情都可以这样写:

ListSubscribers = lists:flatten([emailmarketing:get_list_subscribers(ListId) || ListId <- ListIds])

【讨论】:

  • 嘿,埃米尔,谢谢你的建议,我是 erlang 的初学者......所以无法正确理解你上面给出的内容......这是什么......这是怎么回事。 ..请尽可能解释...
  • emailmarketing:get_list_subscribers/1 的返回类型是什么,您希望 ListSubscribers 是什么样子?
  • 不,我不会进一步解释我的代码,因为它是如此简单。请查阅 Erlang 文档或有关该主题的书籍(我使用 O'Reilly 的 Erlang Programming)。阅读列表推导。
【解决方案2】:

Erlang 是单赋值函数式语言。您所要做的就是将 var 分配给第一个列表并将 var 分配给第二个连接列表,这将为您提供 ListThree 的结果。 因此,您总是在“更改”(添加、删除、更新等)时生成新列表。

ListOne = getSubs1(),
ListTwo = getSubs2(),
ListThree = lists:append(ListOne, ListTwo),

接下来,当您应用过滤器删除不需要的内容时,您会生成另一个列表,

ListFour = lists:filter(fun(X) -> ... end, ListThree).

等等。每次更改某些内容时,您总是会生成新列表,永远不会更改以前的列表。

在您的情况下,ListSubscribers 仅在 forall fun 范围内可见,您应该将其更改为 map 之类的东西,您的 mapfilter 将生成这样的结果列表。

ListOfLists = [ 1, 2, 3, 4, 5, 6],
ResultList = lists:filter(fun(X) X rem 2 =:= 0 -> end, ListOfLists),

所以 ResultList 将是所有从我们的乐趣中返回 true 的元素。

[2,4,6]

接下来,您必须对其应用下一个过滤器。

【讨论】:

    【解决方案3】:

    我得到了解决方案,我使用递归方法将列表与新元素结合起来。示例如下:

    combine_list_subscriber([First | Rest]) ->
        {Subscriber} = bson:lookup ('subscriber', First),
        [Subscriber | combine_list_subscriber(Rest)];
    combine_list_subscriber([]) ->
        [].
    

    谢谢, 阿杰

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2013-06-08
      • 2014-06-16
      相关资源
      最近更新 更多