1

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

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

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

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

% 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.

谢谢!

4

3 回答 3

3

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

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

ListSubscribers = lists:flatten([emailmarketing:get_list_subscribers(ListId) || ListId <- ListIds])
于 2012-04-16T14:52:24.260 回答
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 之类的东西,并且您的maporfilter将产生这样的结果列表。

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

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

[2,4,6]

接下来,您将不得不对其应用下一个过滤器。

于 2012-04-16T13:27:49.970 回答
0

我得到了使用递归方法将列表与新元素组合的解决方案。这是示例:

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

谢谢,阿杰

于 2012-04-23T10:28:29.477 回答