今天這篇文章我們來談談F#的模式比對,模式比對在F#中充當著很重要的角色,msdn是這麼描述它的:“模式”是用於轉換輸入資料的規則。模式將在整個 F# 語言中使用,採用多種方式將資料與一個或多個邏輯結構進行比較、將資料分解為各個構成部分,或從資料中提取資訊。從某種情況來看,它與C#中的switch蠻類似的,不過在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中博主的原文:http://apollo13cn.blogspot.com/2012/11/f-c-pattern-matching.html