Erlang: проверить повторяющиеся элементы

Я пытаюсь сделать функцию, которая читает {Jid, Text} и проверяет, есть ли она уже в списке, возвращает true, иначе, если это не так, эта функция должна добавить ее в список, а затем вернуть false

Что я делаю:

new_seen() -> [{"[email protected]", "hello"}].

check({Jid, Text}) ->
    Term = {Jid, Text},
    case lists:member(Term, new_seen()) of
        true -> true;
        false ->
            %% here I want to add {Jid, Text} to new_seen() list.
            false
    end.

Простой пример:

check({"[email protected]", "hi"}).
%% here should appened {"[email protected]", "hi"} to the list and return false.


%% if I run function again :
check({"[email protected]", "hi"}).

%% here should return True cuz {"[email protected]", "hi"} in the list.

Я хочу использовать его с ejabberd, чтобы проверить, дублируются ли вставленные сообщения.


person Mr. zero    schedule 30.06.2016    source источник
comment
Каковы ваши потребности? Какие данные вам нужно хранить в этом списке? Это большая база данных? Вы, вероятно, захотите проверить Erlang ETS или Словарь процессов   -  person A. Sarid    schedule 30.06.2016
comment
@ А.Сарид, да, это большая база данных. да, но я не должен использовать ets или обрабатывать словарь, потому что данных слишком много. Я также спросил здесь: stackoverflow.com/questions/35958767/ есть ли способ сделать это?   -  person Mr. zero    schedule 30.06.2016
comment
Кажется, вы получили ответ на свой предыдущий вопрос. Так почему бы не использовать ETS для вашей базы данных? Он должен точно подходить для больших баз данных.   -  person A. Sarid    schedule 30.06.2016
comment
@A.Sarid Я редактирую свой вопрос.   -  person Mr. zero    schedule 30.06.2016
comment
@ А.Сарид, это правда? paste.ubuntu.com/18170115   -  person Mr. zero    schedule 30.06.2016
comment
Вы должны отметить ответ как правильный или ответить, почему он неверен, @Mr. нуль   -  person muehsi    schedule 14.03.2017


Ответы (1)


Вы также проверяли различные базы данных, такие как mnesia (Kev/Value Storage)? Возможно, они смогут. Кажется, вам может помочь карта. Вы можете получить доступ к значениям для определенного ключа. Вы также должны проверить это на learnyousomeerlang.

Если вам нужен список, просто добавьте элемент. С вашим кодом:

check({Jid, Text}) ->
    Term = {Jid, Text},
    case lists:member(Term, new_seen()) of
        true -> true;
        false ->
            %% here I want to add {Jid, Text} to new_seen() list.
            NewList = [Term|new_seen()]
    end,
NewList.

Вы должны вернуть новый список и сохранить его в другом месте, так как вы не можете обновить список в своей функции new_seen(). Если вам действительно нужно вернуть true, поместите это в последнюю строку: {true, NewList}, которая возвращает кортеж с true и новый список.

person muehsi    schedule 30.06.2016
comment
Верно, но я предполагаю, что если ему нужна база данных, он должен добавить этот список в качестве другого параметра функции: check({Jid, Text}, Database). и используйте Database вместо вызова new_seen(). - person A. Sarid; 30.06.2016