函數(shù)式編程

2018-02-24 15:53 更新

函數(shù)式編程

函數(shù)式編程是阿隆佐思想的在現(xiàn)實(shí)世界中的實(shí)現(xiàn)。不過(guò)不是全部的lambda演算思想都可以運(yùn)用到實(shí)際中,因lambda演算在設(shè)計(jì)的時(shí)候就不是為了在各種現(xiàn)實(shí)世界中的限制下工作的。所以,就像面向?qū)ο蟮木幊趟枷胍粯?,函?shù)式編程只是一系列想法,而不是一套嚴(yán)苛的規(guī)定。有很多支持函數(shù)式編程的程序語(yǔ)言,它們之間的具體設(shè)計(jì)都不完全一樣。在這里我將用Java寫(xiě)的例子介紹那些被廣泛應(yīng)用的函數(shù)式編程思想(沒(méi)錯(cuò),如果你是受虐狂你可以用Java寫(xiě)出函數(shù)式程序)。在下面的章節(jié)中我會(huì)在Java語(yǔ)言的基礎(chǔ)上,做一些修改讓它變成實(shí)際可用的函數(shù)式編程語(yǔ)言。那么現(xiàn)在就開(kāi)始吧。

Lambda演算在最初設(shè)計(jì)的時(shí)候就是為了研究計(jì)算相關(guān)的問(wèn)題。所以函數(shù)式編程主要解決的也是計(jì)算問(wèn)題,而出乎意料的是,是用函數(shù)來(lái)解決的?。ㄗg者:請(qǐng)理解原作者的苦心,我想他是希望加入一點(diǎn)調(diào)皮的風(fēng)格以免讀者在中途睡著或是轉(zhuǎn)臺(tái)……)。函數(shù)就是函數(shù)式編程中的基礎(chǔ)元素,可以完成幾乎所有的操作,哪怕最簡(jiǎn)單的計(jì)算,也是用函數(shù)完成的。我們通常理解的變量在函數(shù)式編程中也被函數(shù)代替了:在函數(shù)式編程中變量?jī)H僅代表某個(gè)表達(dá)式(這樣我們就不用把所有的代碼都寫(xiě)在同一行里了)。所以我們這里所說(shuō)的‘變量’是不能被修改的。所有的變量只能被賦一次初值。在Java中就意味著每一個(gè)變量都將被聲明為final(如果你用C++,就是const)。在FP中,沒(méi)有非final的變量。

final int i = 5;
final int j = i + 3;

既然FP中所有的變量都是final的,可以引出兩個(gè)規(guī)定:一是變量前面就沒(méi)有必要再加上final這個(gè)關(guān)鍵字了,二是變量就不能再叫做‘變量’了……于是現(xiàn)在開(kāi)始對(duì)Java做兩個(gè)改動(dòng):所有Java中聲明的變量默認(rèn)為final,而且我們把所謂的‘變量’稱(chēng)為‘符號(hào)’。

到現(xiàn)在可能會(huì)有人有疑問(wèn):這個(gè)新創(chuàng)造出來(lái)的語(yǔ)言可以用來(lái)寫(xiě)什么有用的復(fù)雜一些的程序嗎?畢竟,如果每個(gè)符號(hào)的值都是不能修改的,那么我們就什么東西都不能改變了!別緊張,這樣的說(shuō)法不完全正確。阿隆佐在設(shè)計(jì)lambda演算的時(shí)候他并不想要保留狀態(tài)的值以便稍后修改這些值。他更關(guān)心的是基于數(shù)據(jù)之上的操作(也就是更容易理解的“計(jì)算”)。而且,lambda演算和圖靈機(jī)已經(jīng)被證明了是具有同樣能力的系統(tǒng),因此指令式編程能做到的函數(shù)式編程也同樣可以做到。那么,怎樣才能做到呢?

事實(shí)上函數(shù)式程序是可以保存狀態(tài)的,只不過(guò)它們用的不是變量,而是函數(shù)。狀態(tài)保存在函數(shù)的參數(shù)中,也就是說(shuō)在棧上。如果你需要保存一個(gè)狀態(tài)一段時(shí)間并且時(shí)不時(shí)的修改它,那么你可以編寫(xiě)一個(gè)遞歸函數(shù)。舉個(gè)例子,試著寫(xiě)一個(gè)函數(shù),用來(lái)反轉(zhuǎn)一個(gè)Java的字符串。記住咯,這個(gè)程序里的變量都是默認(rèn)為final的5。

String reverse(String arg) {
    if(arg.length == 0) {
        return arg;
    }
    else {
        return reverse(arg.substring(1, arg.length)) + arg.substring(0, 1);
    }
}

這個(gè)方程運(yùn)行起來(lái)會(huì)相對(duì)慢一些,因?yàn)樗貜?fù)調(diào)用自己6。同時(shí)它也會(huì)大量的消耗內(nèi)存,因?yàn)樗鼤?huì)不斷的分配創(chuàng)建內(nèi)存對(duì)象。無(wú)論如何,它是用函數(shù)式編程思想寫(xiě)出來(lái)的。這時(shí)候可能有人要問(wèn)了,為什么要用這種奇怪的方式編寫(xiě)程序呢?嘿,我正準(zhǔn)備告訴你。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)