Дело в Эрланге - PullRequest
       29

Дело в Эрланге

1 голос
/ 30 ноября 2009

Работая с делом Эрланга, я столкнулся с проблемой. Проблема заключается в следующем:

other languages:
switch(A) 
{
  case "A" : case "B" :
   //do something
  break;
}

Итак, как добиться того же, используя Erlang? Потому что иногда очень важно ставить такие условия, чтобы избежать накладных расходов.

Ответы [ 3 ]

6 голосов
/ 30 ноября 2009

Вы можете использовать регистр выражений в Erlang. Синтаксис:

case Expression of
    Pattern1 [when Guard1] -> Expr_seq1;
    Pattern2 [when Guard2] -> Expr_seq2;
    ...
end

Цитировать Прагматичный Эрланг:

case оценивается следующим образом. Первый, Выражение оценивается; прими это оценивает Значение . После этого Значение сопоставляется по очереди с Pattern1 (с дополнительной защитой Guard1 ), Pattern2 и т. Д. До совпадения найденный. Как только совпадение найдено, тогда соответствующее выражение последовательность оценивается - результат оценка последовательности выражения значение выражения case. Если ни один из шаблонов не совпадает, тогда исключение повышено.

Пример:

filter(P, [H|T]) ->
    case P(H) of
        true -> [H|filter(P, T)];
        false -> filter(P, T)
    end;
filter(P, []) ->
    [].

фильтр (P, L); возвращает список всех тех элементов X в L, для которых P (X) истинно. Это может быть написано с использованием сопоставления с образцом, но конструкция case делает код чище. Обратите внимание, что выбор между сопоставлением с шаблоном и выражениями кейса зависит от вкуса, стиля и опыта.

6 голосов
/ 30 ноября 2009

Может быть охранники - это то, что вы хотите.

the_answer_is(N) when A == "A"; A == "B";

; - это ИЛИ , - это И

3 голосов
/ 30 ноября 2009

Не мой любимый стиль, но вы можете сделать что-то вроде:

case A of
  _ when A == "A";
         A == "B" -> do_ab();
  _ when A == "C";
  _ when A == "D" -> do_cd();
  _               -> do_default()
end.
...