2017-01-05 10 views
0
-module(erltoy). 
-compile(export_all). 

isFive(5) -> true; 
isFive(_) -> false. 

foo(X) -> 
case X of 
    isFive(X) -> true; 
    3 -> false; 
    _ -> nope 
end. 



1> c(erltoy). 
erltoy.erl:9: illegal pattern 
error 

Могу ли я не вызывать функции как часть соответствия шаблону?Вызывающие функции в случае соответствия шаблону паттерна являются незаконными шаблонами?

ответ

3

isFive (X) -> true; содержит выражение, которое не может быть вычислено константе во время компиляции и, следовательно, не является допустимым pattern. Арифметическое выражение может использоваться в шаблоне, если оно отвечает двум из следующих двух условий:

  • В нем используются только числовые или побитовые операторы.
  • Его значение может быть оценено с постоянной при соблюдении.

Смотрите этот пример из справочника Erlang

case {Value, Result} of 
    {?THRESHOLD+1, ok} -> ... 
3

завершить @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.