2012-04-16 9 views
0

Erlang добавить элемент в тот же список? возможно ли это в erlang? Если нет, то помогите мне, кто-то достигнет этого, любым альтернативным решением.Erlang добавить элемент в тот же список

Фактическое требование, которое я должен сделать это следующим образом:

У меня есть несколько идентификаторов списков, так на основе списка идентификаторов, я должен получать все подписчики электронной почты идентификатор, статус которого не равен «B», «U '(Отскочил и отменил подписку) в 1 список, и после этого мне нужно удалить дубликаты идентификаторов электронной почты из этого списка. Подписчики, как только я получу правильный 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. 

Спасибо!

+1

Так же, как то, что @sch сказал и что была опубликована в вашем предыдущем вопросе, вы должны создать новую переменную и присвоить возвращаемое значение ' list :: append() 'в эту новую переменную. –

+0

Ajay, программирование на функциональном языке очень отличается от программирования на императивных языках, таких как Java, Python, JavaScript и т. Д. В Erlang структуры данных неизменяемы, переменные могут быть связаны только один раз, нет встроенных циклов. Это совсем другой язык, чем те, к которым вы привыкли. – dsmith

ответ

1

Erlang - это единый функциональный язык. Все, что вам нужно сделать, это назначить одному первому списку var и var to second next concat list, и это даст вам ListThree с результатами. Итак, вы всегда производите новый список при «изменении» (добавлении, удалении, обновлении и т. Д.).

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

рядом, когда вы примените фильтр удаления нежелательных вы производите еще один список,

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

и т.д. Вы всегда производить новый список каждый раз, когда вы что-то изменить не изменить предыдущую.

В вашем случае ListSubscribers видна только в области фонового удовольствия, вы должны изменить ее на что-то вроде карты, а ваш map или filter будет отображать список результатов следующим образом.

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

так что ResultList будет всем элементом, который возвращает true из нашего удовольствия.

[2,4,6] 

И дальше вам нужно будет применить к нему следующие фильтры.

1

Обратите внимание, что Erlang - это функциональный язык программирования. Это очень отличается от императивных языков, таких как C или PHP. Кодирование Erlang будет требует базового понимания функционального программирования, включая одно назначение, рекурсию, функции более высокого порядка, а также, возможно, список понятий.

Сводные списки могут быть действительно полезны в вашем сценарии. Я думаю, что многое из того, что вы пытаетесь сделать, можно записать так:

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

Эй, Эмиль, Спасибо за ваше предложение, я начинаю erlang ... так не могу получить его должным образом, что вы дали выше ... Что это ... что происходит в этом ... пожалуйста, объясните, если это возможно. .. –

+0

Каков тип возвращаемого адреса электронной почты: get_list_subscribers/1 и что вы хотите, чтобы ListSubscribers выглядели? –

+0

Нет, я не буду объяснять свой код дальше, так как это так просто. Пожалуйста, обратитесь к документации Erlang или к книге по этому вопросу (я использую * Erlang Programming * от O'Reilly). Читайте сведения о списках. –

0

Я получил решение, которое я использовал рекурсивный метод, чтобы объединить мой список с новым элементом.Вот пример:

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

Спасибо, Аджай