模式匹配

2018-02-24 15:53 更新

模式匹配

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

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

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

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

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

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

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

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

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

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號