Erlang函式與模式匹配(2)

2021-08-09 14:14:21 字數 1370 閱讀 5566

在《erlang函式與模式匹配》中介紹了函式的定義方法與模式匹配在函式定義中的基本應用,本節繼續深入這個主題。

一、元組在函式引數中的模式匹配

如果你需要定義乙個將厘公尺轉換為公尺的函式,最簡單的就是:

convert(x) ->

x / 100.

可是,如果使用者輸入了長度單位是分公尺的話,函式無法分辨,結果一定是悲劇。為了不發生悲劇,我可以這樣定義:
convert() ->

x / 100.

當為此函式傳入引數值時應為乙個元組,比如。

可能有一天,想需要將函式的功能進行擴充套件,可以將厘公尺、公釐、分公尺通通轉為公尺,那麼你可能想,這需要在函式體中通過相關方法進行判斷所傳入的長度值的具體單位後,再計算並返回結果。然而,erlang的模式匹配可以在函式的引數中運用後即可輕鬆實現:

convert() ->

x / 100;

convert() ->

x / 10;

convert() ->

x / 1000.

這樣,當傳入不同的引數時,由於在函式進入時進行了模式匹配,所以它就可以計算了正確的結果。

如果你傳入了,匹配子句1則會輸出3,如果輸入了,匹配子句2則會輸出30。其在互動式環境執行結果如下圖所示:

當然,你還可以新增更多的標準單位計算。

二、列表在函式引數中的模式匹配

大多數程式語言,實現對列表的處理一般是在函式內部使用迴圈語句來實現的,而erlang中是沒有迴圈語句的。

erlang 中要實現迴圈的方法是用模式匹配和遞迴呼叫來完成對列表處理。其一般模式如下(本程式並無應用意義,只是用來說明問題的,但也是可以執行的):

process() ->

0;process([h|t]) ->

process(t).

這裡使用了列表的模式匹配。當傳入非空列表時,通過模式匹配會執行第二個子句,此時,傳入的列表被分為兩部分,第一部分為h,即列表的第乙個元素值,稱為列表的頭,第二部分為t,稱為列表的尾,它是乙個包含除了列表第乙個元素外的所有元素的列表。而後遞迴呼叫process(t),傳入的是列表的尾。這樣不斷的遞迴呼叫,總會到達t為空的(當列表只含乙個元素時,執行模式匹配後,h匹配到唯一的乙個元素,t匹配的結果為空列表)呼叫。這時,第乙個子句會成功進行模式匹配,執行後,返回結果為0。

例如傳入引數[1,2,3],匹配的過程是:

h=1 t=[2,3]

h=2 t=[3]

h=3 t=

erlang模式匹配小記錄

初學erlang,這裡對erlang的模式匹配進行記錄一下,當然下面是我從各個不同的 摘取的一些值得注意的地方,主要方便自己以後的查閱。下面總結了幾點需要注意的地方 1 模式匹配為變數賦值提供了基本的機制。被賦值後,變數便被繫結 否則便是未繫結變數。給變數賦值的動作稱作 繫結 變數一旦被繫結便不可更...

Erlang與OO設計模式strategy模式

以前看過head first design patterns覺得是個不錯的書,學習了一點設計模式,現在弄erlang了,十分想兩者結合對比著看看,不為別的,體會兩者之間的區別跟聯絡,看看世界到底是oo的,還是functional的 d 由於我並沒有什麼真正oo的程式設計經驗,難免錯誤很多,大家批判著...

模式匹配 關於模式匹配的演算法實現2

參照我上篇部落格,只不過多了乙個識別率的演算法而已,還是參考歸併排序寫的,很簡單。上篇部落格位址 很多的解釋都在 裡面了,各位看看就明白了 author seen time 2015 09 20 include include include using namespace std struct p...