天天看點

讀函數式程式設計思維筆記02_轉變思維

作者:躺着的柒
讀函數式程式設計思維筆記02_轉變思維

讀函數式程式設計思維筆記02_轉變思維

1.指令式程式設計

1.1.按照“程式是一系列改變狀态的指令”來模組化的一種程式設計風格

1.2.傳統的for循環

1.2.1.确立初始狀态

1.2.2.每次疊代都執行循環體中的一系列指令

1.2.2.1.将操作安排在循環内部去執行

1.3.Java

1.3.1.消除了垃圾收集的麻煩

2.函數式程式設計

2.1.程式描述為表達式和變換,以數學方程的形式建立模型,并且盡量避免可變的狀态

2.2.不會用很多抽象,但每個抽象的泛化程度都很高(特化的方面通過高階函數注入)

2.3.以參數傳遞和函數的複合作為主要的表現手段

2.4.不需要掌握太多作為“不确定因素”存在的其他語言構造之間的互動規則

2.5.操作(filter、transform、convert),每一種都作為一個邏輯分類由不同的函數所代表,這些函數實作了低層次的變換,但依賴于開發者定義的高階函數作為參數來調整其低層次運轉機構的運作

2.6.好處

2.6.1.換一種角度去歸類問題,看到問題的共性

2.6.2.讓運作時有更大的餘地去做智能的優化

2.6.3.讓埋頭于實作細節的開發者看到原本視野之外的一些解決方案

2.6.4.在更高的抽象層次上做事情,運作時才好去優化低層次的細節

2.7.Clojure

2.7.1.抹去了并發的麻煩

2.7.2.Lisp靈活的文法

2.7.2.1.什麼時候可讀性變差了,我們就調整文法去滿足可讀性

3.完美數的分類問題

3.1.一個完美數的真約數(即除了自身以外的所有正約數)之和,恰好等于它本身

3.2.指令式解法

3.3.稍微向函數式靠攏的完美數分類解法

3.4.完美數分類的Java 8實作

3.4.1.緩求值(lazy evaluation)

3.5.完美數分類的Functional Java實作

3.5.1.Java8之前的實作方式

3.5.2.用匿名内部類來模拟高階函數的程式設計風格

3.5.3.高階函數消除了摩擦

4.基本構造單元

4.1.篩選(filter)

4.1.1.根據使用者定義的條件來篩選清單中的條目,并由此産生一個較小的新清單

4.1.2.将使用者(通常以高階函數的形式)給定的布爾邏輯作用于集合,傳回由原集合中符合條件的元素組成的一個子集

4.1.3.Scala

4.1.3.1.filter()

4.1.3.1.1.傳回所有比對元素的集合

4.1.3.2.partition()

4.1.3.2.1.由原集合的内容劃分而成的兩個集合,原集合本身保持不變

4.1.3.3.find()

4.1.3.3.1.隻傳回第一個比對項

4.1.3.4.takeWhile()

4.1.3.4.1.從集合頭部開始,一直取到第一個不滿足斷言的元素

4.1.3.5.dropWhile()

4.1.3.5.1.從集合頭部開始,一直丢棄滿足斷言的元素,直到遇到第一個非比對項

4.1.4.Groovy

4.1.4.1.findAll()

4.1.4.2.split()

4.1.4.3.find()

4.1.4.4.takeWhile()

4.1.4.5.dropWhile()

4.1.5.Clojure

4.1.5.1.(filter )

4.2.映射(map)

4.2.1.對原集合的每一個元素執行給定的函數,進而變換成一個新的集合

4.2.2.傳給映射函數的是一個高階函數和一個集合,它在對集合中的每一個元素施用傳入的函數之後,産生另一個集合作為傳回值

4.2.2.1.傳回的集合大小與原來傳入的集合相同,隻是元素的取值變了

4.2.3.展平(flattening)

4.2.3.1.用來消除嵌套的庫函數

4.2.4.Scala

4.2.4.1.map()

4.2.4.2.flatMap()

4.2.5.Groovy

4.2.5.1.collect()

4.2.5.1.1.it關鍵字作為參數占位标記

4.2.5.2.flatten()

4.2.6.Clojure

4.2.6.1.(map )

4.2.6.2.(flatten )

4.3. ***折疊(fold)/

化約(reduce)***

4.3.1.catamorphism這種範疇論的态射概念具體應用到清單操縱上面的變體

4.3.2.reduce

4.3.2.1.一般在需要為累積量設定一個初始值的時候使用

4.3.3.fold

4.3.3.1.起始的時候累積量是空的

4.3.4.用累積量(accumulator)來“收集”集合元素

4.3.5.在純函數式語言裡,左折疊和右折疊的實作并不相同

4.3.5.1.右折疊允許操作無限長度的清單

4.3.5.2.左折疊則不允許

4.3.6.交換律

4.3.6.1.加法滿足交換律

4.3.6.2.減法和除法在内不能随便調換順序

4.3.7.Scala

4.3.7.1.reduce()

4.3.7.2.reduceLeft()

4.3.7.3.reduceRight()

4.3.7.4.運算次序

4.3.7.5.foldLeft()

4.3.7.6.foldRight()

4.3.8.Groovy

4.3.8.1.inject()

4.3.9.Clojure

4.3.9.1.(reduce )

4.3.9.1.1.Reducers庫

繼續閱讀