今天这篇文章我们来谈谈F#的模式匹配,模式匹配在F#中充当着很重要的角色,msdn是这么描述它的:“模式”是用于转换输入数据的规则。模式将在整个 F# 语言中使用,采用多种方式将数据与一个或多个逻辑结构进行比较、将数据分解为各个构成部分,或从数据中提取信息。从某种情况来看,它与C#中的switch蛮类似的,不过在F#中,模式匹配的功能远远多于switch,好吧,接下来让我们一起享受这次的F#之旅吧~内容不在多,在于精辟易于理解~

在介绍它之前,让我们先来看看如下代码:

let a = 1       //nothing fancy
let 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中博主的原文:http://apollo13cn.blogspot.com/2012/11/f-c-pattern-matching.html

 

posted on 2012-11-09 17:35  Jeallyn  阅读(2594)  评论(0编辑  收藏  举报