模式匹配

2018-02-24 15:53 更新

模式匹配

模式匹配并不是什么新功能。而事實上它和函數式編程也沒有什么太大的關系。它之所以常常被認為是FP的一個特性,是因為在函數式語言已經支持模式匹配很長一段時間后的今天,指令式語言是還沒有這個功能。

還是直接用例子來看看什么是模式匹配吧,這是一個用Java寫的Fibonacci函數:

 int fib(int n) {
    if(n == 0) return 1;
    if(n == 1) return 1;

    return fib(n - 2) + fib(n - 1);
}

再看看用我們基于Java修改過的新語言寫出來的Fibonacci函數,這種新語言就支持模式匹配:

 int fib(0) {
    return 1;
}
int fib(1) {
    return 1;
}
int fib(int n) {
    return fib(n - 2) + fib(n - 1);
}

區(qū)別在哪里呢?在于后者的編譯器替我們實現了程序的分支。
這有什么了不起的?確實也沒什么。只是有人注意到很多函數中有非常復雜的switch結構(對于函數式程序而言更是如此),于是想到如果能把這層結構也抽象化就更好了。然后就把這個復雜的函數拆分成若干新的函數,并在這些函數的某些參數中應用模式(這和重載有點類似)。這樣依賴當這個函數被調用的時候,編譯器會在運行時將調用者傳入的參數與各個新函數的參數定義進行比較,找出合適的那個函數來執(zhí)行。合適的函數往往是參數定義上最具體最接近傳入參數的那個函數。在這個例子中,當n為1時,可以用函數int fib(int n),不過真正調用的是int fib(1)因為這個函數更具體更接近調用者的要求。
模式匹配一般來說要比這里舉的例子更加復雜。比如說,高級模式匹配系統(tǒng)可以支持下面的操作:

int f(int n < 10) { ... }
int f(int n) { ... }

那么什么情況下模式匹配會有用呢?在需要處理一大堆程序分支的時候!每當需要實現復雜的嵌套if語句的時候,模式匹配可以幫助你用更少的代碼更好的完成任務。我所知道的一個這樣的函數是標準的WndProc函數,該函數是所有Win32應用程序必須具備的(盡管它經常會被抽象化)。模式匹配系統(tǒng)一般都可以像匹配簡單數值一樣匹配數據集合。舉個例子,對于一個接受數組作為參數的函數,可以通過模式匹配數組中第一個數字為1并且第三個數字大于3的輸入。 模式匹配的另外一個好處是每當需要添加或者修改程序分支時,再也不用面對那個龐大臃腫的函數了。只要添加(或者修改)相關的函數定義即可。有了模式匹配就不再需要四人幫的很多設計模式了。程序分支越多越復雜,模式匹配就越有用。而在習慣使用這一技術之后,你可能會懷疑沒有它你一天都過不下去了。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號