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语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值