■ 模式匹配
模式匹配是F#中的一项非常重要的功能。该功能与C语言中的switch语句相类似。
正确的模式匹配表达式是比较复杂的,所以下面用模式匹配表达式的简略写法进行说明。关于模式匹配的部分说明放在下一节中另行介绍。
-
模式匹配表达式
-
match 模式1 with
| 模式2 -> 表达式
| 模式3 -> 表达式
...
| 模式n -> 表达式
模式2,3,...,n这些模式必须与模式1是相同类型的。
模式从上至下进行匹配,执行匹配一致的地方的表达式。
首先,让我们来看个示例。
|
以上是判断各种货币是否值钱的函数kyoro。
kyoro定义成带有一个参数kutibasi。
在match kutibasi with部分,将kutibasi作为模式匹配的对象,进行模式匹配。
然后,在接下来的部分定义如下内容,
如果是"金子",则显示非常值钱
如果是"银子",则显示比较值钱
如果是其他,则显示不值钱.
第三个模式使用了' '这个模式,它代表其他任何情况都匹配,相当于c语言中的switch语句中的default.
值得注意的有几个地方,首先是同样的内容也可以用if语句进行表达.
|
那么,为什么要使用模式匹配,可以考虑以下理由.
比if语句将不同情况区分得更清楚,
可以检查匹配的模式是否充分足够,是否有无用模式.
例如,让我们来看个无用模式.
模式匹配具有从上往下执行的性质,如果我们一开始就书写刚才介绍的' '模式,那么该模式之后的模式就全部不会进行匹配了.
|
如果将这段程序进行编译,辉显示如下编译警告,显示具有不会进行匹配的模式。
|
■ when关键字
以上示例中如果银子的数量超过一万两,也可以判断成是非常值钱的。
因此,让我们来看下面这个函数,该函数接受货币种类及货币数量两个参数。
|
虽然以上这段代码当然是正确的,但是如果用模式匹配来书写的话该怎样写比较好呢?
事实上,光用介绍到现在为止的模式匹配的知识来写的话,是写不出来的。
为什么,maisuu >= 1000这个条件是光用一个模式是表达不出来的。这种对某个模式添加条件的情况,需要使用到when关键字。
让我们来修改本节一开始介绍的模式匹配的书写方法,变成如下形式.
-
when关键字
-
match 模式1 with
| 模式2 [when 表达式]-> 表达式
| 模式3 [when 表达式]-> 表达式
...
| 模式n [when 表达式]-> 表达式
这个when关键字可以被使用在任何模式中。任何if语句中的内容都可以使用模式匹配来修改成相同内容。
|
在这段代码中,第二行的("银子",x) when x>=10000表示货币的种类为银子且数量在一万两以上。因此,当货币为银子且数量不到一万两时,与最后的模式相匹配。
另外,此处使用的(kutibasi,maisuu)为元组模式,在下一节进行介绍。
■ function关键字
针对函数参数部分进行模式匹配的时候,使用function关键字,简写形式如下。
-
function关键字
-
表达式 := function
| 模式1 [when 表达式] -> 表达式
| 模式2 [when 表达式] -> 表达式
...
| 模式n [when 表达式] -> 表达式
一开始介绍的kyoro函数为只带一个参数的函数,可以直接使用function关键字进行书写。具体来说,以下两种模式为相同意思。
|
|
也就是说,使用function关键字,可以将函数kyoro的参数kutibasi进行隐藏,省略match kutibasi with语句。