摘要:代碼組合在函數式編程中,通過將一個個功能單一的純函數組合起來實現一個復雜的功能,就像樂高拼積木一樣,這種稱為函數組合代碼組合。函數式編程就變成了運用不同的函子,解決實際問題。
高階函數
滿足以下兩點的函數:
函數可以作為參數被傳遞
函數可以作為返回值輸出
叫高階函數,很顯然js中的函數滿足高階函數的條件。
函數作為參數:
function pow(x) { return x * x; } const arr = [1, 2, 3]; const res = arr.map(pow);
函數作為返回值:
function getPrintFn() { function print(msg) { console.log(msg); } return print; }
高階函數與函數式編程有什么關系?通過上一篇我們知道函數式編程采用純函數,那怎么把不純的函數轉化為一個純函數呢?通過把不純的操作包裝到一個函數中,再返回這個函數(即上面的例子),即可達到目的。
柯里化(curry)只傳遞給函數一部分參數來調用它,讓它返回一個函數去處理剩下的參數。
特點:
接收單一參數,將更多的參數通過回調函數來搞定;
返回一個新函數,用于處理所有的想要傳入的參數;
需要利用call/apply與arguments對象收集參數;
返回的這個函數正是用來處理收集起來的參數;
function add(x, y) { return x + y; } // 柯里化 function add(x) { return function(y) { return x + y; } } const increment = add(1); increment(2); // 3
當我們談論純函數的時候,我們說它們接受一個輸入返回一個輸出。curry 函數所做的正是這樣:每傳遞一個參數調用函數,就返回一個新函數處理剩余的參數。這就是一個輸入對應一個輸出。curry函數適用于以下場景:
延遲執行:不斷的柯里化,累積傳入的參數,最后執行。
固定易變因素:提前把易變因素,傳參固定下來,生成一個更明確的應用函數。最典型的代表應用,是bind函數用以固定this這個易變對象。
代碼組合(compose)在函數式編程中,通過將一個個功能單一的純函數組合起來實現一個復雜的功能,就像樂高拼積木一樣,這種稱為函數組合(代碼組合)。下面看一個例子:
最佳實踐是讓組合可重用。
函子我們知道,函數式編程實質是通過管道把數據在一系列純函數間傳遞,但是,控制流(control flow)、異常處理(error handling)、異步操作(asynchronous actions)和狀態(state)呢?還有更棘手的副作用(effects)呢?這些問題的解決就要引入函子的概念了。
我們首先定義一個容器,用來封裝數據
函子封裝了數據和對數據的操作,functor 是實現了map函數并遵守一些特定規則的容器類型。
把值裝進一個容器,而且只能使用 map 來處理它,這么做的理由到底是什么呢?
讓容器自己去運用函數能給我們帶來什么好處?
Functor 是一個對于函數調用的抽象,我們賦予容器自己去調用函數的能力。當 map 一個函數時,我們讓容器自己來運行這個函數,這樣容器就可以自由地選擇何時何地如何操作這個函數,以致于擁有惰性求值、錯誤處理、異步調用等等非常牛掰的特性。
1.Maybe(處理null問題)
2.Either(if…else)
3.IO(IO、網絡請求、DOM)
4.Monad(嵌套問題)
一種用來處理null和undefined問題的函子,避免繁瑣的手動判空操作
Either一種用來處理if…else問題的函子
IO通過返回一個獲取數據的函數來延遲IO的副作用,等調用者去執行有副作用的函數,
以保證獲取數據過程中的無副作用特性
monad 是可以變扁(flatten)的實現了of方法的 functor
總結學習函數式編程,實際上就是學習函子的各種運算。由于可以把運算方法封裝在函子里面,所以又衍生出各種不同類型的函子,有多少種運算,就有多少種函子。函數式編程就變成了運用不同的函子,解決實際問題。
參考文檔
https://github.com/xitu/gold-...
https://llh911001.gitbooks.io...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104535.html
摘要:由于技術棧的學習,筆者需要在原來函數式編程知識的基礎上,學習的使用。筆者在社區發現了一個非常高質量的響應式編程系列教程共篇,從基礎概念到實際應用講解的非常詳細,有大量直觀的大理石圖來輔助理解流的處理,對培養響應式編程的思維方式有很大幫助。 showImg(https://segmentfault.com/img/bVus8n); [TOC] 一. 響應式編程 響應式編程,也稱為流式編程...
摘要:函數式編程,一看這個詞,簡直就是學院派的典范。所以這期周刊,我們就重點引入的函數式編程,淺入淺出,一窺函數式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數式編程就是關于如使用通用的可復用函數進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數式編程(Functional Programming),一...
摘要:函數式編程二拖延癥了好久,第二篇終于寫出來了。如果你對熟悉的話應該還記得,是可以調用來集中處理錯誤的對于函數式編程我們也可以做同樣的操作,如果運行正確,那么就返回正確的結果如果錯誤,就返回一個用于描述錯誤的結果。 JavaScript函數式編程(二) 拖延癥了好久,第二篇終于寫出來了。 上一篇在這里:JavaScript函數式編程(一) 上一篇文章里我們提到了純函數的概念,所謂的純函數...
摘要:注意是單一參數柯里化是由以邏輯學家命名的,當然編程語言也是源自他的名字,雖然柯里化是由和發明的。辨別類型和它們的含義是一項重要的技能,這項技能可以讓你在函數式編程的路上走得更遠。 slide 地址 三、可以,這很函數式~ showImg(https://segmentfault.com/img/remote/1460000015978685?w=187&h=160); 3.1.函數是一...
閱讀 2227·2021-11-15 11:39
閱讀 982·2021-09-26 09:55
閱讀 925·2021-09-04 16:48
閱讀 2831·2021-08-12 13:23
閱讀 919·2021-07-30 15:30
閱讀 2455·2019-08-29 14:16
閱讀 886·2019-08-26 10:15
閱讀 525·2019-08-23 18:40