Я думаю, причина, по которой это не разрешено, заключается в том, что вы хотите гарантировать отсутствие побочных эффектов. Учитывая следующую структуру:
case Expr of
Pattern1 [when GuardSeq1] ->
Body1;
...;
PatternN [when GuardSeqN] ->
BodyN
end
После того, как вы оцените Expr
, шаблоны последовательно сопоставляются с результатом Expr
. Представьте, что ваша функция foo/1
содержит побочный эффект (например, отправляет сообщение):
foo(input) ->
some_process ! some_msg,
output.
Даже если первый шаблон не будет соответствовать, вы все равно отправили бы сообщение и не смогли бы восстановиться после этой ситуации.