函式式程式設計本質的思考

2021-08-20 03:28:16 字數 1374 閱讀 5621

很早就了解函式式程式設計的概念,今天忽然覺得若有所悟,寫點東西放這兒。

1、無變數程式設計,一切皆為常量

我覺得這才是函式式程式設計的關鍵。在學習數學課程時,我們的解題過程會用字母去表示各種各樣的資料,例如「令 x = 1」這種說法,是一種定義,並非程式語言中的賦值語句。

2、想不起來還應該具備其他什麼特徵了

函式式程式設計中,我們是描述函式的定義方法,而不是用計算機如何計算結果,這個是本質性的東西。至於其他特徵,我覺得都是這個本質帶來的一些「福利」而已,這裡列舉一些:

2.1 函式是函實式程式設計的第一型

本老朽愚鈍,始終無法理解這句話的本意,是動不動就拿出來忽悠人的虎皮吧。我覺得理想的函式式程式語言,其中的一切應該皆為函式吧。比如,數字1,是不是可以理解為如下函式?

int

1()

當然,總有一些函式是無需定義的「公理」,基本資料型別就算是這一類「原子函式」吧。既然一切皆函式,函式的引數和返回值理所當然也是函式。

說明:第一 類 物件( first- class object) 指可在執行期建立, 可用作函式引數或返回 值, 可存入變數的實體。 最常見的用法就是匿名函式。(參見:雨痕:《go語言學習筆記》 (kindle 位置 896-897). 電子工業出版社. kindle 版本. )

2.2 無狀態程式設計

沒了變數,狀態變化如何儲存?如果系統需要儲存狀態,核心一定需要乙個能儲存資料的系統來做這件事情,比如資料庫系統。乙個簡單的例子,如果程式語言不支援變數,如果不借助外部 io 裝置,類似 rand() 這樣的隨機數函式,也是無法通過純函式式程式設計實現的,因為 rand() 不符合數學中函式定義。

簡單地講,傳統的三層架構:表現層+業務邏輯層+資料層這樣的體系中,資料層(如果包括資料庫的話)應該是有狀態的;業務邏輯層是可以做成無狀態的;表現層是使用者介面,目前都是oop模型,想做成無狀態不太可能。

函式式程式設計思想的有價值之處在於,在系統設計時,應該把有狀態的子系統剝離緊縮到最小的體積,盡可能把系統設計成無狀態形式。因此,函式式程式設計用於伺服器端業務邏輯層的設計應該是最合適的。像redis這樣的記憶體資料庫系統,不可能用純粹的無變數函式式程式設計來實現。

我也想過利用閉包實現 rand(), 好像不用變數的話也實現不了。這一點,誰要是有好的想法可以告訴我。

2.3 平行計算

a = calc_a();

b = calc_b();

c = a + b;

採用延遲計算技術,前兩句不會立即執行,到第三句時,會觸發平行計算同時計算 a、b 的值,實現平行計算。

函式式程式設計中的函式 函式式程式設計的多型

函式式程式設計中的函式 函式式程式設計的多型 儲存了計算上下文和計算過程的特殊值 儲存了計算上下文和計算過程的有輸入輸出的可計算結構。儲存了計算上下文和計算過程的可配置結構 柯里化 函式作為一種特殊的值和結構,可以由更高階的函式對其進行組合 變換 柯里化等操作 函式作為輸入和輸出 本質上都是可配置 ...

程式設計的本質

書名 程式設計的本質 英文版 原書名 elements of programming 作者 alexander stepanov paul mcjones isbn 9787111300274 定價 49.00元 出版社 機械工業出版社 出版年 2010年4月 豆瓣網討論 http www.doub...

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

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