завершить @byaruhaf ответ, левая часть пункта случае не нужно быть постоянным, когда скомпилирован. следующий код действителен, и, очевидно, Temp
не известен во время компиляции (но foo (5) не оценивает!).
-module(erltoy).
-compile(export_all).
isFive(5) -> true;
isFive(_) -> false.
foo(X) ->
Temp = isFive(X),
case X of
Temp -> true;
3 -> false;
_ -> nope
end.
Это даже не обязательно, что левая часть связана во время выполнения, например, это справедливо, и I
является несвязанным до оценки случая, и связал во время сопоставления с образцом:
get_second_element_of_3_terms_tuple_if_pos_integer(X) ->
case X of
{_,I,_} when is_integer(I), I>0 -> {true,I};
_ -> false
end.
Левая часть корпуса должна быть действительным шаблоном с дополнительной защитной последовательностью.
Действительный шаблон является Эрлангом термина, который может содержит несвязанные переменный, он также может содержать арифметические выражения, если они соблюдать 2 условия
- Он использует только числовые или Битовые оператор.
- Его значение может быть оценено с постоянной при соблюдении.
определение последовательности охраны дается there in erlang documentation
Последнее замечание, обычный Эрл способ кодирования рода тестовой функции, заданной в вашем примере использовать различные функции головы, так же, как и для isFive/1.