В настоящее время лучший способ сделать это - использовать модуль, который обрабатывает наборы, такие как ordsets :
> ordsets:subtract(ordsets:from_list(List1), ordsets:from_list(List2)).
["Baby","Brandy","Lady"]
Если вы используете Erlang / OTP 22 или более позднюю версию (которая должна быть выпущена в июне 2019 года), лучше всего использовать оператор --
:
> List3 = List1 -- List2.
["Brandy","Lady","Baby"]
Сложность во время выполнения этой операции - O (n log n), начиная с Erlang / OTP 22, но в более ранних версиях Erlang сложность во время выполнения этой операции - O (n * m), поэтому она будет работать очень плохо, если оба списка очень длинные.
См. главу «Отставные мифы» в Руководстве по эффективности Эрланга :
12.3 Миф: вычитание списка (оператор "-") медленное
Вычитание списка, которое раньше имело сложность во время выполнения, пропорциональную произведению длины его операндов, поэтому оно было чрезвычайно медленным, когда оба списка были длинными.
Начиная с OTP 22, сложность во время выполнения равна "n log n", и операция завершится быстро, даже если оба списка очень длинные. Фактически, это быстрее и использует меньше памяти, чем обычно используемый обходной путь, чтобы преобразовать оба списка в упорядоченные наборы, прежде чем вычесть их с помощью ordsets:subtract/2
.