F#入門-第二章 F#基礎-第十九節 模式匹配(一)

模式匹配
  
模式匹配是F#中的一項非常重要的功能。該功能與C語言中的switch語句相類似。
    正確的模式匹配表達式是比較複雜的,所以下面用模式匹配表達式的簡略寫法進行說明。關於模式匹配的部分說明放在下一節中另行介紹。

 模式匹配表達式
    match 模式1 with
    | 模式2 -> 表達式
    | 模式3 -> 表達式
    ...
    | 模式n -> 表達式


    模式2,3,...,n這些模式必須與模式1是相同類型的。
    模式從上至下進行匹配,執行匹配一致的地方的表達式。

    首先,讓我們來看個示例。

模式匹配示例

let kyoro kutibasi =
        match kutibasi with
                  | "金子" -> print_endline "非常值錢"
                  | "銀子" -> print_endline "比較值錢"
| _ -> print_endline "不值錢"

in
kyoro "金子";
kyoro "銀子";
kyoro "其他";


    以上是判斷各種貨幣是否值錢的函數kyoro。
    kyoro定義成帶有一個參數kutibasi。
    在match kutibasi with部分,將kutibasi作爲模式匹配的對象,進行模式匹配。   
    然後,在接下來的部分定義如下內容,
    如果是"金子",則顯示非常值錢
    如果是"銀子",則顯示比較值錢
    如果是其他,則顯示不值錢.
    第三個模式使用了' '這個模式,它代表其他任何情況都匹配,相當於c語言中的switch語句中的default.

    值得注意的有幾個地方,首先是同樣的內容也可以用if語句進行表達.

使用if語句進行表達

let kyoro kutibasi =
if kutibasi = "金子" then print_endline "非常值錢"
else if kutibasi = "銀子" then print_endline "比較值錢"
else print_endline "不值錢"
in
kyoro "金子";
kyoro "銀子";
kyoro "其他";;


    那麼,爲什麼要使用模式匹配,可以考慮以下理由.
    比if語句將不同情況區分得更清楚,
    可以檢查匹配的模式是否充分足夠,是否有無用模式.

    例如,讓我們來看個無用模式.


    模式匹配具有從上往下執行的性質,如果我們一開始就書寫剛纔介紹的' '模式,那麼該模式之後的模式就全部不會進行匹配了.

無用模式示例

let kyoro kutibasi =
match kutibasi with
| _ -> print_endline "不值錢"
| "金子" -> print_endline "非常值錢"
| "銀子" -> print_endline "比較值錢"
in
kyoro "金子";
kyoro "銀子";
kyoro "其他";;


    如果將這段程序進行編譯,輝顯示如下編譯警告,顯示具有不會進行匹配的模式。

編譯警告

warning FS0026: This rule will never be matched.


when關鍵字
    以上示例中如果銀子的數量超過一萬兩,也可以判斷成是非常值錢的。
    因此,讓我們來看下面這個函數,該函數接受貨幣種類及貨幣數量兩個參數。

改良版kyoro

let kyoro kutibasi maisuu =
if kutibasi = "金子" then printfn "非常值錢"
elif kutibasi = "銀子" && maisuu >= 10000 then printfn "非常值錢"
else printfn "不值錢";;
kyoro "銀子"" 4;; //不值錢
kyoro "銀子" 10000;; //非常值錢


    雖然以上這段代碼當然是正確的,但是如果用模式匹配來書寫的話該怎樣寫比較好呢?
    事實上,光用介紹到現在爲止的模式匹配的知識來寫的話,是寫不出來的。
    爲什麼,maisuu >= 1000這個條件是光用一個模式是表達不出來的。這種對某個模式添加條件的情況,需要使用到when關鍵字。
    讓我們來修改本節一開始介紹的模式匹配的書寫方法,變成如下形式.

 when關鍵字
    match 模式1 with
    | 模式2  [when 表達式]-> 表達式
    | 模式3  [when 表達式]-> 表達式
    ...
    | 模式n  [when 表達式]-> 表達式


    這個when關鍵字可以被使用在任何模式中。任何if語句中的內容都可以使用模式匹配來修改成相同內容。

使用when關鍵字的kyoro

let kyoro kutibasi maisuu =
match (kutibasi,maisuu) with
| ("金子",_) -> printfn "非常值錢"
| ("銀子",x) when x>=10000 -> printfn "非常值錢"
| _ -> printfn "不值錢";;


    在這段代碼中,第二行的("銀子",x) when x>=10000表示貨幣的種類爲銀子且數量在一萬兩以上。因此,當貨幣爲銀子且數量不到一萬兩時,與最後的模式相匹配。

    另外,此處使用的(kutibasi,maisuu)爲元組模式,在下一節進行介紹。
   
function關鍵字
   
針對函數參數部分進行模式匹配的時候,使用function關鍵字,簡寫形式如下。

 function關鍵字
        表達式 := function
    | 模式1 [when 表達式] -> 表達式
    | 模式2 [when 表達式] -> 表達式
    ...
    | 模式n [when 表達式] -> 表達式


    一開始介紹的kyoro函數爲只帶一個參數的函數,可以直接使用function關鍵字進行書寫。具體來說,以下兩種模式爲相同意思。

不使用function關鍵字

let kyoro kutibasi =
match kutibasi with
| "金子" -> print_endline "非常值錢"
| "銀子" -> print_endline "比較值錢"
| _ -> print_endline "不值錢"

 

使用function關鍵字

let kyoro = function
| "金子" -> print_endline "非常值錢"
| "銀子" -> print_endline "比較值錢"
| _ -> print_endline "不值錢"


    也就是說,使用function關鍵字,可以將函數kyoro的參數kutibasi進行隱藏,省略match kutibasi with語句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章