隨手寫寫Functional programming (函數式編程)



簡述:Functional programming 通常要注意以下特性,並建議在學習上套用數學而非程式下
去看,不然會很痛苦XD

關鍵字:#functional_programming #Pure_function #First_class #High-order_function #Currying#Closure

一. Pure function (純函數)

Pure function 只談兩件事情
1. 每次,同一筆輸入得到相同的輸出
2. 不會產生 side effect(副效應)

這意味著函數將會是 stateless 的,不會去干擾外面的世界,而且隨時可以複製貼上與移除。系統上來看,節點可以隨時關掉或開啟新的。在 unix philosophy 上來看,每個小工具的輸入跟輸出可以輕鬆組合,而且不會有額外 state 造成難以控制的變數。程式上來看,就是每段程式碼可以輕鬆測試,組合。

ex:
在工廠裡面的作業員,每個人都是獨立的,隨時都是可以補充或淘汰,最好做事情時不要來請教我,不然我會很煩(side effect),或是日久生情(stateful)。

這種思維下用人的公司,裡面員工只是員工,不是夥伴。

二. First-class (Function/......)

這個其實很容易的,簡單來說,就是 functnio 在底層的身份地位與變數相等,也就是說 Double, Int, Function 是相等地位,彼此的位置可以調動。在底層來看,原本 heap 純放變數位置的地方也可以放入 function。

這個概念一定要建立起來,後面的三個特性才會順。

三. High-order Function

High-order function 表輸入值後,可以得到一個函數或是普通輸出,就如同數學的高階一樣,對函數 x^2 進行一次微分得到 2*x,我把 x^2 丟進去裡面得到 2*x 出來。

定義 f(x) = x +1, g(x) = x * x, f(g(x))且 x = 2 時,輸出等於多少?下一次 x = 2 時,結果是否與這次相同?

四. Partial function => Currying

談 Currying 前先說說 Partial function,因為兩者概念上很接近,但又不是相同,就是像而已。 Partial function 表一個函數有多個輸入時,只先對其中一個做動作。Currying 表一個函數一定只接受一個輸入,這是跟 Partial 最大不同。

舉例來說:定義 def add(x, y) = x + y
Partial function 中
result = partial(add, 5)
result = result(7)

Currying 中為
result = Curry(add)
result_2 = result(5)
result_3 = result_2(7)

這邊有實際的案例可以了
https://stackoverflow.com/questions/218025/what-is-the-difference-between-currying-and-partial-application/23438430#23438430

五. Closure/memorize/Lazy

Closure 表函數的變數只存在於創造時的環境裡(scope)。

比較像是我創造新的國罵,然後國罵只存在我的世界,只要我還活著,這個國罵的含義一直都在XDDDD

留言

這個網誌中的熱門文章

Raspberry pi 樹莓派系列 :安裝瀏覽器

『如何說出好故事|故事架構介紹|輕鬆做出大師級故事架構』

『目標管理|SMART原則|最有效的目標管理原則』