javascript
JS函数式编程概念理解:函子(Functor)
標簽(空格分隔): 函數式編程 函子 functor
很多前端在學習函數式編程之前,都會被各種概念折磨的死去活來,本文的重點算是函數式編程之前的一個甜品,重點在如何切入。
函子即Functor是FP(函數式編程簡寫)當中重要的概念,理解這個概念對你學習FP后面的很重要。不然學的就是云里霧里。
網上的文章不在少數,很多人也看過,筆者非科班出身,僅從個人角度學習和科普這個知識點
送給川普的豬頭肉
有這么一個場景,可以想象下,我們和鄰居之間交換東西,都很直接,不需要繁瑣的包裝等等。就像加減法一樣,1 + 1 = 2;假如我要給在美國的親戚特朗普寄送一些豬頭肉。很顯然我不能拿著豬頭肉直接去。
我首先會把豬頭肉包裝,那么他就是被容器化之后的肉,交給快遞員,我會告訴快遞員這個裝有肉的容器打開方法,因為通過海關的時候需要打開進行檢疫,然后蓋上郵戳,重新包裝,送往美國白宮。
以上例子并不是肉自己直接走過去的,而是容器化之后的肉,有包裝的方法,比如易碎、保險、向上打開等等注意事項,防止海關檢查的時候不小心損壞。
我們有用代碼實現下
//肉盒子 class MeatBox {constructor(meat) {this.value = meat;}//map為打開包裝的方法map(fn) {return new MeatBox(fn(this.meat));} }復制代碼海關打開之后檢疫完成,他又會根據盒子的規范重新打包成新的肉容器,方便在美國海關檢疫。同樣美國海關覺得豬頭肉和好吃,咬一口,又打包成原來的樣子,給川普總統。
繼續看代碼流程
//把肉容器化 let meatBox1 = new MeatBox('豬頭肉'); //海關檢疫 let meatBox2 = meatBox.map(function(meat){return check(meat); }); //美國海關咬了一口 let meatBox3 = meatBox.map(function(meat){return eat(meat); }); //川普吃到了你的豬頭肉 meatBox3.map(function(meat){return Trump(meat); }); 復制代碼用鏈式寫法
new MeatBox('豬頭肉').map(check).map(eat).map(function(trump); 復制代碼如果白宮在你家隔壁,你直接送過去就行,沒這么多事。但是很明顯不行。我們總結一下上面幾個特點
- 肉從一個單體或者一個值被容器化了,變成了一個具有數據類型的容器
- 每一次對肉的都會拿出來進行計算然后又重新根據規則或者協議標準容器化;
- 容器具有map這個方法,來取值,并且返回的也有map方法;
- 還可以鏈式調用;
- 像我們學習數據時候的映射 y = f(x),包含了值和變形關系;
什么是函子呢(Functor)?
根據以上的場景,得出
- Functor(函子)遵守一些特定規則的容器類型或者數據編程協議;
- 具有一個通用的map方法,返回新實例,這個實例和之前實例有相同的規則;
- 具有結合外部的運算能力;
按照我的理解,函子Functor其實準確的來說是:值被容器化之后具有一條標準協議規范的數據類型或者數據容器。map屬于函子的一個特征,Monad(單子),這個概念后面講,肯定還有跟多的單子。
如果單純的說具有map的數據類型是函子,沒錯但是不嚴謹。比如引用類型數據,很多文章也認為是函子,因為也具有map方法。
其實在阮一峰的文章當中說的很清楚,我就不再闡述,有興趣的可以看看。
Functor 是一個對于函數調用的抽象,賦予容器自己去調用函數的能力。把東西裝進一個容器,只留出一個接口 map 給容器外的函數,map 一個函數時,我們讓容器自己來運行這個函數,這樣容器就可以自由地選擇何時何地如何操作這個函數,以致于擁有惰性求值、錯誤處理、異步調用等等非常牛掰的特性。
說了這么多,應用場景呢?
其實從上面的場景看,你可能會說,我直接去白宮不就完了,省的川普說為什么有人送了一塊咬過得的肉。
在編程開發中,尤其是多人協作,一個數據從數據庫出來,會各種計算、加入業務邏輯,最終呈現給消費方。數據鏈路越長,數據元信息越容易丟失。就好像一句話通過幾個人之后,完全和原來的意思相差甚遠。
以上只是一方面,更多是融合在函數式編程當中,讓數據的計算和業務剝離,我們不用大量的業務邏輯和命令式編程,例如for循環,把重點放在副作用上的等(副作用在這里是中性詞);數據鏈路會更容易清晰去實現。
這就是函子的基本概念,其實也沒那么復雜,理解這個對你函數式編程有很大的幫助。
有興趣的可以關注筆者QQ群:126274877
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的JS函数式编程概念理解:函子(Functor)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于 NodeGit 的周报生成工具
- 下一篇: 登录界面