Erlang:检查重复的元素

Erlang:检查重复的元素,erlang,ejabberd,Erlang,Ejabberd,我试图让读取{Jid,Text}的函数返回true,如果不是,则该函数应将其附加到列表中,然后返回false 我正在做的是: new_seen() -> [{"user@domain.tld", "hello"}]. check({Jid, Text}) -> Term = {Jid, Text}, case lists:member(Term, new_seen()) of true -> true; false ->

我试图让读取
{Jid,Text}
的函数返回
true
,如果不是,则该函数应将其附加到列表中,然后返回
false

我正在做的是:

new_seen() -> [{"user@domain.tld", "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({"us1@domain.tld", "hi"}).
%% here should appened {"us1@domain.tld", "hi"} to the list and return false.


%% if I run function again :
check({"us1@domain.tld", "hi"}).

%% here should return True cuz {"us1@domain.tld", "hi"} in the list.

我想将它与ejabberd一起使用,以检查插入的消息是否重复。

您是否也检查过不同的数据库,如mnesia(Kev/Value Storage)?也许他们可以 好像一个医生可以帮你。您可以访问特定键的值。你也应该检查一下

如果需要列表,只需附加元素即可。使用您的代码:

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和新列表的元组。

您需要什么?您需要在该列表中保存哪些数据?它是一个大数据库吗?您可能需要检查或@A.Sarid是的,这是一个大数据库。是的,但我不应该使用ets或过程字典,因为有太多的数据。我在这里还问:有什么办法可以做到这一点吗?似乎你在上一个问题中得到了答案。那么,为什么不在数据库中使用ETS呢?它应该完全适合大型数据库。@A.Sarid我编辑我的问题。@A.Sarid这是真的吗?是的,但是我想如果他需要一个数据库,他应该将这个列表作为另一个参数添加到函数中:
check({Jid,Text},database)
。并使用
数据库
而不是调用
new\u seen()