什么是泛函編程(Functional Programming)?泛函編程就是用函數編寫程序。這個回答太抽象,等於沒說。
再說清楚一點:泛函編程就想砌積木一樣把函數當成積木塊,把函數的輸出輸入作為積木的楔子和楔孔,把一個函數的輸出當作另一個函數的輸入組合成一個更大的函數。整個砌積木的過程就是泛函編程。嗯,這個稍微清楚了一點,不過這樣做來干什么呢?相對於泛函編程模式還有指令編程模式(Imperative Programming)。我們熟悉的OOP編程就是指令編程模式。在指令編程中我們按順序用一條條指令改變程序中的一些變量來實現整個程序狀態轉變。而在泛函編程中我們首先按照程序要求把一些特定的函數用特定的方式組合起來形成另一個獨立的大函數;然后把一些東西輸入到這個大函數的輸入口;當輸入物經過那條由內部組件函數輸入輸出形成的曲折通道到達輸出口時就產生了需要的結果(很像輸入物件的變形過程)。輸入物每經過一個組件函數,程序的狀態就會發生一些轉變,整個過程實際上就是程序的狀態變形(Program State Transformation)。那么,可不可以說指令編程就對應變量賦值,泛函編程相當於函數組合呢?實際上“函數組合”這個詞是泛函編程的靈魂,英文是Functional Composition。這么說是不是又清楚了一點了?不過對於我們這些用了一輩子OOP編程的人來說,相對於用一條指令設定一個變量直接看到結果來說,泛函編程實現狀態轉變的方式是那么的奇妙又不可琢磨。不用擔心,改變觀念是需要過程的。要知道泛函編程是一個全新的編程范疇。
如果泛函編程就是組合函數,那這可是一種全新的編程方式。如何實現函數的組合呢?泛函編程是以數學理論(⋋-culculus)為基礎的,程序函數的組合是通過數學函數組合定律來實現的。嗯,的確是一套全新的概念,那就讓我們從頭學起吧。