2017-01-05 21 views

回答

3

isFive(X) - >真;包含在編譯時無法計算爲常量的表達式,因此不是有效的pattern

  • 它僅使用數字或位運算符:一個算術表達式可以如果滿足兩個下列兩個條件的圖案內使用。
  • 它的值在編譯時可以評估爲常數。

參見本實施例中從二郎參考手冊

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

完成@byaruhaf答案的情況下子句的左側部分不需要時編譯爲恆定。下面的代碼是有效的,顯然Temp在編譯時是未知的(但是foo(5)的計算結果爲nope!)。

-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. 

的情況下的左側部分必須是具有可選的後衛序列有效模式。

有效模式是可以包含未結合的變量一個Erlang術語,其也可以包含算術表達式,如果他們遵守2個條件

  • 它僅使用數字或位運算符。遵從當
  • 它的值可以被計算爲一個常數。

保護序列的定義給出there in erlang documentation

最後一點,平時的二郎神的實現代碼的那種在你的例子給定的測試功能是使用不同功能的頭,就像你做是五/ 1定義。