初學erlang,這裡對erlang的模式匹配進行記錄一下,當然下面是我從各個不同的**摘取的一些值得注意的地方,主要方便自己以後的查閱。下面總結了幾點需要注意的地方:
1:模式匹配為變數賦值提供了基本的機制。被賦值後,變數便被繫結——否則便是未繫結變數。給變數賦值的動作稱作「繫結」。變數一旦被繫結便不可更改。這種變數屬性被稱為一次性繫結或單次賦值。這種屬性與傳統命令式語言的破壞性賦值[2]相反。這一點區別其他程式語言;
2:如果乙個模式與乙個項式在結構上同構,且在模式中任一位置出現的原子資料型別也都在項式的相應位置上出現,則稱他們它們相互匹配;
3:如果模式中包含未繫結變數,則該變數在匹配過程中將被繫結到項式中相應的元素。如果在模式中相同的變數多次出現,則項式中對應位置的元素也必須相同;
= .
如果是 = . 這樣子就會報錯
4:模式匹配[a,b,c,d] = [1,2,3]則會失敗。雖然它們兩個都是列表型別,但是左邊的列表有4個元素,而右邊乙個列表只有3個元素。乙個常見的誤解是d可以設定為空列表,然後模式匹配應該成功。在這個例子中這是不可能的,因為c和d之間由逗號而不是構造器操作符分隔開。[a,b,c|d]=[1,2,3]的模式匹配就會成功,變數a、b和c分別繫結到整數1、2和3,變數d則繫結到尾部,在這裡就是空列表。如果我們嘗試[a,b|c]=[1,2,3,4,5,6,7],a和b將分別繫結到1和2,而c則會繫結到乙個包含[3,4,5,6,7]的列表;
5:最後乙個例子,[h|t]=會失敗,因為[h|t]意味著這個列表至少要有乙個元素,而我們右邊其實是乙個空列表;
6:變數可以用下劃線開始,下劃線是乙個特殊的標記,它告訴編譯器,這些變數是無關緊要的,它們只是作為程式中不需要的變數的佔位符。「無關緊要的」變數的功能跟普通變數一樣,可以檢查、使用和比較它們的值。唯一不同的是,普通變數的值如果從未使用過,編譯器將會發出警告,而使用「無關緊要的」變數則不會。使用「無關緊要的」變數是一種很好的程式設計實踐,這告訴閱讀**的人應該忽略掉這個值。為了提高可讀性和維護性,程式設計師經常以「無關緊要的」變數的形式引入值和型別。下劃線本身也是個「無關緊要的」變數,但不能訪問其內容:因為它的值被忽略了而且從未繫結。
當模式匹配的時候,請注意「無關緊要的」變數的使用,讓我們來看下面的具體例子:
} = }
由於_變數從不繫結,因此它的值匹配不匹配都是無關的。但是,如果我們這麼寫:
} = }
這就徹底改變了程式的語義。該變數_int先繫結到整數23,隨後和乙個包含整數23的列表相比較。這將導致這個模式匹配失敗。
****當然你有可能想問為什麼這樣不行。這要考慮到erlang的特性,_int = 23,這樣_int就被繫結了資料23,而[b|_int] = [22,23],這樣b = 22,但是_int = [23],這是_int是列表了,所以不行。
下面給出乙個模式匹配的例子:
-module(myset).
-export([new/0,add_element/2,del_element/2,is_element/2,is_empty/1,union/2,intersection/2]).
new() ->
.add_element(x,set) ->
case is_element(x,set) of
true ->
set;
false ->
[x | set]
end.
is_element(x,[x | _]) ->
true;
is_element(x,[_ | t]) ->
is_element(x,t);
is_element(_,) ->
false.
del_element(x,[x | set]) ->
set;
del_element(x,[_ | set]) ->
del_element(x,set);
del_element(_,) ->
.is_empty() ->
true;
is_empty(_) ->
false.
union([h | t],set) ->
union(t,add_element(h,set));
union(,set) ->
set.
intersection(s1,s2) ->
intersection(s1,s2,).
intersection(,_,s3) ->
s3;intersection([x|h],s2,s3) ->
case is_element(x,s2) of
true ->
intersection(h,s2,[x|s3]);
false ->
intersection(h,s2,s3)
end.
Erlang 學習小記 erlang 表,
cmd 控制台 輸入 erl 可以進入erl的shell 就可以 使用erlang 語法 進行控制 erl每個語句結束用 結尾 運算算數運算和其他語言基本一樣 在控制台 輸出 1 2加個 再按回車 即可得到輸出結果 模組中如果想要呼叫其他模組 需要在頭部 新增 module 模組名字 加 即可 模組...
Erlang函式與模式匹配(2)
在 erlang函式與模式匹配 中介紹了函式的定義方法與模式匹配在函式定義中的基本應用,本節繼續深入這個主題。一 元組在函式引數中的模式匹配 如果你需要定義乙個將厘公尺轉換為公尺的函式,最簡單的就是 convert x x 100.可是,如果使用者輸入了長度單位是分公尺的話,函式無法分辨,結果一定是...
Erlang舊誤區記錄
以前的誤區 誤區1 funs 執行速度很慢 誤區2 列表解析很慢 列表解析過去是使用fun來實現的,在過去,fun確實很慢。現在,編譯器將列表推導式重寫為普通的遞迴函式。使用尾部遞迴函式並在末尾執行反向操作會更快。還是嗎?這就引出了乙個誤區 尾部遞迴功能比主體遞迴功能更快。誤區3 列表減法 運算子 ...