Проверка на членство в гвардии Эрланга - PullRequest
6 голосов
/ 03 августа 2011

Какой самый простой способ написать оператор if в Erlang, где часть охранника - member(E, L), т. Е. Проверить, является ли E членом списка L?Наивный подход:

if 
  ... andalso member(E,L) -> ...
end

Но он не работает, потому что, если я правильно понимаю, member не является защитным выражением.Какой способ будет работать?

Ответы [ 3 ]

13 голосов
/ 03 августа 2011

Функциональность члена, как вы говорите, не является действительной защитой. Вместо этого вы могли бы рассмотреть возможность использования шаблона случая? Возможно, вы включите другие операторы if в выражение case.

case {member(E,L),Expr} of
  {true,true} -> do(), is_member;
  {true,false} -> is_member;
  {false,_} -> no_member
end
6 голосов
/ 03 августа 2011

Невозможно проверить членство в списке охранника в Эрланге.Вы должны сделать это:

f(E, L) ->
    case lists:member(E, L) of
        true  -> ...;
        false -> ...
    end.
2 голосов
/ 07 августа 2011

Самое простое - считать охранники частью сопоставления с образцом, частью, которая не может или трудно выразить в самом образце.Таким образом, guard - это последовательность охранных тестов , а не логических выражений.Оригинальный защитный синтаксис позволил увидеть разницу, но теперь они выглядят как логические выражения, а не так.

...