函式式程式設計

2021-09-11 20:24:44 字數 2153 閱讀 8241

函式程式設計(簡稱fp)不只代指haskell scala等之類的語言,還表示一種程式設計思維,軟體思考方式,也稱面向函式程式設計。 程式設計的本質是組合,組合的本質是範疇category,而範疇是函式的組合。

首先,什麼是函式式程式設計,這並沒有唯一定義,它只是廣泛聚合了一些程式設計風格的特性,我們可以將它與物件導向程式設計oop進行對比, 兩者區別是,oop主要聚焦於資料的區別,而fp則注重資料結構的一致性。oop最大優點是多型性和封裝;而fp優勢是不變性及其宣告性風格,兩者其實是正交,可互補的,可在同一程式中共存。

物件導向:

資料和對資料的操作緊緊耦合

.物件隱藏它們操作的實現細節,其他物件呼叫這些操作只需要通過介面。

.核心抽象模型是資料自己

核心活動是組合新物件和拓展已經存在的物件,這是通過加入新的方法實現的。

函式程式設計:

資料與函式是松耦合的

函式隱藏了它們的實現,語言的抽象是函式,以及將函式組合起來表達。

核心抽象模型是函式,不是資料結構

核心活動是編寫新的函式。

變數預設是不變的,減少可變性變數的使用,併發性好

那麼oop和fp在業務領域是否有勝者呢? 我們大部分業務邏輯是這樣寫:

select orders.order_id, orders.order_date, suppliers.supplier_name

from suppliers

right outer join orders

on suppliers.supplier_id = orders.supplier_id

where orders.order_status = 『incomplete』

order by orders.order_date desc;

sql是非常類似fp,它能滲透到業務中,它使用一致的資料結構(資料表結構schema),一些基本函式能組合成很多查詢語句,它是declarative宣告式的, 也就是說,寫出的sql是告訴資料庫我需要什麼,資料庫就為你返回,而不必指定資料庫如何具體去查詢。

宣告式程式設計和命令式程式設計區別? fp的主要特點是它們描述它們要"什麼",而不是如何實現。而oo在其方法中,還是使用大部分命令式技術。 下面是命令式技術**:

var sumofsquares = function(list)

return result;

};console.log(sumofsquares([2, 3, 5]));

函式程式設計**如下:

var sumofsquares = pipe(map(square), reduce(add, 0));

console.log(sumofsquares([2, 3, 5]));

函式風格的程式設計特點:

第一等公民是函式

帶有閉包的lambdas/anonymous函式

不變性,大部分無態處理,沒有狀態和變數

高併發無***的呼叫

通過tail call實現遞迴的效能優化。

模式匹配(haskell, erlang)

懶賦值(miranda, haskell)

homoiconicity(類似lisp)

如果說oop還有很多人可能受靜態資料思路影響,那麼fp 帶來完全是動態事件,fp讓我們直接用動詞思考,用方法函式解決問題,比如兩個帳號之間的轉帳,按照ddd等靜態領域建模思維,轉帳這個功能是放在帳號這個實體類中,還是做乙個服務呢?在oop語言中,我們實現功能總是使用服務service這樣乙個概念替代,而且強調無態服務,無態服務實際就是乙個只有方法函式沒有屬性的空架子「類」而已。 2023年的adam heroku一篇博文中寫道:銀行賬戶之間轉帳的老式做法是使用資料庫事務,這種做法比較剛性,正確做法是將轉帳事件儲存起來,如果你是乙個面向函式正規化的思維者覺得這樣做就很正常。—來自" nosql儲存的基於事件的事務實現 " 。

有很多人將fp歸結於數學思維,實際上這只看到其表面,沒有看到數學語言這個背後的形式邏輯,程式語言作為和數學同等形式語言,他們的核心基礎都是分析哲學的形式邏輯,過去的物件導向很多設計原則也**於形式邏輯,見:蒯因與引用透明 。

物件導向和面向函式一直在爭論,實際上純粹的oop和純粹的fp都是極端的,對於oop來講:存在的並一定都是物件,函式就不是物件;對於fp來說:存在的並不總是純粹的,***總是真實存在。總之,物件導向側重於分解,函式程式設計側重於組合。

函式式程式語言python 函式式程式設計

函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...

函式式程式設計

最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...

函式式程式設計

維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...