程序运行结果如下:
(myOr true false) = true
(myOr false false) = false
(myAnd (true, false)) = false
(myAnd (true, true)) = true
myOr 函数有两个 Boolean 参数,放在关键字 match和 with 中间,用逗号隔开,形成元组;而myAnd 函数只有一个参数,本身就是元组。每一种方法,对创建元组模式匹配的语法是相同的,与创建元组的语法相似。
如果需要匹配元组中的值,常数或标识符要用逗号隔开,常数或标识符的位置定义了它要匹配元组中哪一项。如myOr 函数的第一、二个规则和myAnd 函数的第一规则,这些规则用常数匹配元组的一部分,如果想在规则中分别处理元组中各部分,可以使用标识符。仅仅是因为需要处理元组,但并不表示总是需要看到组成元组的各个部分。
myOr 的第三规则和 myAnd 的第二规则用通配符 _ 匹配整个元组,如果想在规则的后面用到元组中的值,也可用标识符替代。
由于模式匹配在F# 中是很常用的任务,因此,语言提供了快捷语法。如果函数的唯一目的就是针对某一件事的模式匹配,那么,使用这种语法是值得的。这个版本的模式匹配语法,用关键字function,把模式放到通常放函数参数的位置,然后,把所有可选的规则用竖线分开。下面的例子演示了这个语法,用一个简单的函数递归处理一个字符串列表,并把它连接成一个字符串。
let recconactStringList =
function head :: tail -> head +conactStringList tail
| [] -> ""
//test data
let jabber = ["'Twas ";"brillig,";"and "; "the "; "slithy "; "toves "; "..."]
//call funcation
let completJabber =conactStringList jabber
//print the result
printfn"%s" completJabber
运行结果如下:
'Twas brillig, and the slithy toves ...
模式匹配是 F# 的基础部分,在本章中还会有几个地方讲到。我们会看到针对列表、记录类型、联合类型、异常处理的模式匹配,模式匹配的最高级用法在本章最后的“活动模式”一节讨论,其他匹配的基础。在第四章要讨论针对非 F# 库函数中类型的模式匹配。