函數式程序設計(functional programming)是指編寫(xiě)函數式程序的方法與過(guò)程,其主要任務(wù)在于定義(或構造)函數以求解所提出的問(wèn)題。定義的函數(可看作主程序)可能包括一些輔助函數(可看作子程序)。計算機按照所定義函數的相應表達式,根據計算規則逐步計算,最后得到所需的結果。表達式中可能包含函數名,計算時(shí)可將其相應的定義作為歸約規則。函數式程序設計的一個(gè)顯著(zhù)特點(diǎn)是:若一個(gè)表達式有定義,則該表達式的最后結果與其計算次序無(wú)關(guān)。[1]

中文名

函數式程序設計

外文名

functional programming

語(yǔ)義基礎

λ-演算

實(shí)質(zhì)

函數的遞歸構造過(guò)程

應用學(xué)科

計算機科學(xué)

組成

原始函數、定義函數和函數型

特性

傳統程序設計語(yǔ)言中的賦值等概念,在函數式程序設計語(yǔ)言中消失。函數式程序的一個(gè)最本質(zhì)的特性,就是函數值唯一地由其參數值所確定。只要使用相同的參數值,對此程序的不同的調用總是得到相同的結果。這種性質(zhì)稱(chēng)為

引用透明性

,有助于程序的模塊化。函數式程序設計語(yǔ)言具有較強的組織數據結構的能力,

數組

可以把某一數據結構(如數組)作為單一值處理;可以把函數作為參數,其結果也可為函數,這種定義的函數稱(chēng)為高階函數。這些由函數表達式所表示的程序簡(jiǎn)明、緊湊和易于維護。

過(guò)去,這種程序設計稱(chēng)為應用性程序設計。1977年,J.巴克斯提出函數式程序設計的概念。一般認為表處理語(yǔ)言(LISP)是最早的函數式程序設計語(yǔ)言。但是,LISP的重點(diǎn)是將函數應用于對象,以產(chǎn)生新的對象,必要時(shí)再上升為函數。巴克斯所提出的函數式程序設計,則是引用函數型產(chǎn)生新函數,程序設計時(shí)從一般的對象空間上升到函數空間,因而具有優(yōu)越的數學(xué)性質(zhì),有助于程序的理解、推理和驗證。

用途

由于函數式程序設計語(yǔ)言的簡(jiǎn)明性和獨特的表達能力,可用它來(lái)研究傳統程序設計語(yǔ)言的語(yǔ)義。一種方法是用于確定一個(gè)解釋程序的定義,作為被研究的語(yǔ)言的語(yǔ)義;另一種方法是將被研究的語(yǔ)言寫(xiě)成的程序轉換成與之等價(jià)的函數式程序。在人工智能領(lǐng)域中,需要用復雜的算法去處理一些復雜的(通常是符號的)數據結構。LISP語(yǔ)言成功地應用于這一領(lǐng)域,說(shuō)明了函數式程序設計的獨特優(yōu)越性。巴克斯分析了傳統程序設計語(yǔ)言的缺陷,認為這些缺陷主要是由于諾伊曼式系統結構所造成的。他所提出的函數式程序設計(簡(jiǎn)稱(chēng)FP),擺脫了傳統的諾伊曼計算機結構,需要一種新的非諾伊曼式的系統結構為后援。一些具有新概念的計算機,如歸約機、數據流機,以及專(zhuān)為某種函數式語(yǔ)言(如FP)設計的計算機正在研究和發(fā)展中?,F代既需要研究在諾伊曼式計算機上如何更有效地實(shí)現函數式程序設計語(yǔ)言的問(wèn)題,也需要研究適應這種語(yǔ)言的新型計算機結構。

重要性

函數式程序設計受到重視的原因有很多。首先,由于產(chǎn)生了“軟件危機”,人們企圖探討一種擺脫這種困境的新型程序設計方式,而函數式程序設計具有不少獨特之處。其次,超大規模集成電路技術(shù)的發(fā)展,為發(fā)揮函數式程序設計語(yǔ)言的潛在并行性提供了物質(zhì)基礎??梢灶A期,一些具有諸如高度并行性等特點(diǎn)的非諾伊曼式計算機將會(huì )出現。隨著(zhù)硬件技術(shù)的發(fā)展、軟件方法的研究,以及應用范圍的不斷擴大,函數式程序設計將得到發(fā)展,并在新一代計算機系統中起重要作用。

函數語(yǔ)言

從數學(xué)觀(guān)點(diǎn)看,函數是從一個(gè)域(定義域)到另一個(gè)域(值域)的映射,即函數描述了兩個(gè)域上元素的對應關(guān)系。因此,函數語(yǔ)言是一種描述性語(yǔ)言,它只給出需求解問(wèn)題的定義而不需給出具體的求解過(guò)程和細節。求解過(guò)程是語(yǔ)言本身經(jīng)過(guò)應用一系列重寫(xiě)規則實(shí)現的。

函數語(yǔ)言

λ-演算作為一個(gè)重寫(xiě)系統滿(mǎn)足合流性,即一個(gè)項若有范式,則不同的重寫(xiě)策略將導致相同范式,從而保證程序求解的唯一性。

由上可知,函數語(yǔ)言具有相當清晰簡(jiǎn)明的指稱(chēng)語(yǔ)義和重寫(xiě)操作語(yǔ)義,這對程序正確性驗證尤為重旁。函數語(yǔ)言的主要優(yōu)點(diǎn)是:(1)數學(xué)優(yōu)美性,(2)簡(jiǎn)單性,(3)引用透明性。正是由于這些優(yōu)點(diǎn),所以易于語(yǔ)言編寫(xiě)程序,且程序易讀易維護,程序也很短小簡(jiǎn)練。特別地,程序具有較好的代數性質(zhì),易于程序演繹和正確性驗證。引用透明性帶來(lái)的另一個(gè)主要優(yōu)點(diǎn)是程序具有天生的并行性。

最早的函數語(yǔ)言可數Lisp,是McCarthy在1960年創(chuàng )立的,其初始動(dòng)機是為考慮匿名函數的表示,開(kāi)發(fā)一個(gè)用于A(yíng)l的代數表處理語(yǔ)言。

應該說(shuō)在Lisp開(kāi)發(fā)早期卜演算的影響甚微,但由于Lisp本身有很好的數學(xué)優(yōu)美性,它對函數語(yǔ)言的發(fā)展產(chǎn)生了重大影響。Lisp至今仍是最流行的函數語(yǔ)言,主要用于智能系統的編程。出于效率的考慮,它現已變成一種不純的、有副作用的函數語(yǔ)。