Programming Clojure學習筆記——函數編程

5.1 函數編程概念
1. 純函數
函數式程序由純函數構成。純函數沒有副作用,它只依賴與函數參數,只能通過函數返回值影響函數外部。
純函數常常與不可變數據一起工作。如:
(defn mystery [input]
    (if input data-1 data-2))
如果data-1和data-2是可變的,則它們可能被外界改變,對相同的input參數,可能輸出不同,這與純函數的特性不符。

2.持久化數據結構
所有Clojure數據結構都是持久的,即Clojure數據結構保持原版數據的同時最大程度與新版本的數據共享結構。
如給列表a
(def a ’(1 2))
添加元素0,得到列表b
(def b (cons 0 a))
此時列表a沒有改變,列表b由元素0和a的元素組成,並沒有再重複構建元素1和2,及b直接共享a的元素。

3.延遲(Laziness)和遞歸(Recursion)
函數編程大量使用遞歸和延遲。
遞歸:一個函數直接或間接地調用自己;
延遲:一個表達式的值直到真正使用時才計算。計算延遲表達式的值稱爲實現表達式。

Clojure中,函數和表達式都不是延遲的,但序列通常都是延遲的。

4.引用透明(Referential Transparency)
延遲依賴一種特性,這種特性是在任何時候都可以直接將函數調用替換爲函數返回值。擁有這種特性的函數被認爲是引用透明的,因爲注意的函數調用可以被替換但不影響程序的行爲。
引用透明受益於:
(1) 緩存,自動緩存函數結果
(2) 自動並行移動函數結果到其他進程或機器

所有的純函數都是引用透明的。

5. 函數編程(FP)的好處
(1) 易於閱讀和編寫,因爲函數只與輸入參數有關
(2) 提高複用
(3) 可組織,純函數是真正封裝的和可組織的

6. 六個原則
Clojure中函數編程有六個原則:
(1) 避免直接遞歸
(2) 使用recur生成標量值或小的固定序列
(3) 生成大的可變序列一定要延遲
(4) 只實現延遲序列中需要的那一部分數據
(5) 使用序列庫,避免直接使用recur和延遲相關API
(6) 細分
這六條原則都是指導性的,並不是絕對的。只要有足夠的理由就可以不遵守它們。
發佈了134 篇原創文章 · 獲贊 12 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章