函式程式設計(簡稱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 而且 演算的函式可以接受函式當...