今天这篇文章我们来谈谈F#的,模式匹配在F#中充当着很重要的角色,msdn是这么描述它的:“模式”是用于转换输入数据的规则。模式将在整个 F# 语言中使用,采用多种方式将数据与一个或多个逻辑结构进行比较、将数据分解为各个构成部分,或从数据中提取信息。从某种情况来看,它与C#中的蛮类似的,不过在F#中,模式匹配的功能远远多于switch,好吧,接下来让我们一起享受这次的F#之旅吧~内容不在多,在于精辟易于理解~
在介绍它之前,让我们先来看看如下代码:
let a = 1 //nothing fancylet b = 1, 2 // b is tuple now
这里定义的b是一个,元组这个概念我们之前有聊过,同时也将它与C#中的Swap进行过对比,有兴趣的朋友可以查看详细信息。回到本文,在上面的代码中,对于习惯于C#开发的朋友来说,如果你想要得到元组的第一个和第二个元素,最明显的方式是调用 fst 和 snd 函数,这当然是一种办法,但是现在,我们可以使用模式匹配还达到相同效果:
let c,d = b // c = 1 and d = 2
接下来,我们来试着使用模式匹配分解一个:
let l = [1;2;3;4]match l with| h::t -> ... // h is 1 and t is [2;3;4]| _ -> ...
关于::(cons)运算符,它有两个功能,第一是可以将元素附加到列表中,第二是将列表头与列表尾分离,这里使用的是第二个功能。上面的代码中我们看到,一个列表的列表头与列表尾分离开,因此得到了我们想要的结果,那么,如果你需要得到1,2而剩下3,4该怎么做呢?同样很简单,看如下代码:
match l with| h0::h1::t -> ... // h0 is 1, h1 is 2, and t is [3;4]| _ -> ...
如果列表的长度是已知的,比如列举的这个例子,我们的列表只有4个元素,那么你也可以用以下方式分解这个列表:
match l with| [a;b;c;d] -> //a=1, b=2, c=3, and d=4| _ -> ...
好了,今天的pattern matching介绍完了,是不是有所收获呢?同时,我也很好奇,应该如何使用C#来实现相同的功能。:)
注:此文为译文,如有兴趣请查看blogspot中博主的原文: