Erlang сопоставление с функциями - PullRequest
5 голосов
/ 05 июля 2011

Поскольку Erlang является почти чисто функциональным языком программирования, я думаю, что это возможно:

case X of
    foo(Z) -> ...
end.

, где foo(Z) - разрешаемо-обратимая чистая (без побочных эффектов) биективная функция, например ::

foo(input) -> output.

Тогда в случае, если X = output, Z будет соответствовать как input.

Возможно ли использовать такую ​​семантику с другим синтаксисом или без него, чем в моем примере, в Erlang?

Ответы [ 4 ]

4 голосов
/ 05 июля 2011

Нет, то, что вы хотите, невозможно.

Чтобы сделать что-то подобное, вы должны быть в состоянии найти инверсию любой биективной функции, которая явно неразрешима.

2 голосов
/ 06 июля 2011

Я думаю, причина, по которой это не разрешено, заключается в том, что вы хотите гарантировать отсутствие побочных эффектов. Учитывая следующую структуру:

case Expr of
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
end

После того, как вы оцените Expr, шаблоны последовательно сопоставляются с результатом Expr. Представьте, что ваша функция foo/1 содержит побочный эффект (например, отправляет сообщение):

foo(input) ->
  some_process ! some_msg,
  output.

Даже если первый шаблон не будет соответствовать, вы все равно отправили бы сообщение и не смогли бы восстановиться после этой ситуации.

1 голос
/ 14 июля 2011

Нет, Erlang поддерживает только буквенные шаблоны!

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

1 голос
/ 06 июля 2011

Что вы можете сделать, это:

Y = foo(Z),
case X of
  Y -> ...
end.
...