# 重新思考 FP ###### tags: `Functional Programming` 這篇文章是我學習 Functional Programming 的一個紀錄,同時講述哪些對於我來說是最有幫助的,以及該怎麼看待 Functor 跟 Monad,或許可以帶給讀者們一些啟發。 ### 初步探索 FP 大概在去年,因緣際會下我接觸了 Functional Programming,當初想學習的原因是我想把前端專案中組件內雜亂的 function 跟 state 寫的更漂亮更整潔。在初期我應用了 pure function、immutable 想法寫程式有了不錯成效之後,我也進一步使用 lodash 內的 fp 做一些 function 的組合應用。 ### Pure function 這大概是 FP 中最核心的一部分,也是最值得花時間的部分,不僅對為你學習 FP 打下紮實的基礎也對任何程式都是有幫助的,每個 function 都有明確的輸入輸出並且不影響任何外部的變數,這使我們不必過度的去堤防其他人在 function 內部做了各種額外得動作,導致發生非預期結果。 ### Immutable immutable 在一個較為複雜的 function 內起到了一個降低開發者心智負擔的效果,值一旦建立即不可變,我們不必在一個 function 中來回觀察變數的變化。而在一般的 pure function 可以避免因為語言特性而修改到外部變數,對其他人來說都是有益的,雖然有時會損失一些效能,但在不嚴重影響使用者體驗的情況下我認為是可以接受的。 ### Function composition 這將會是 FP 最有趣的階段,在你使用 pure function 及 immutable 概念一段時間後,會期望這些東西能在更進一步的應用。而這個應用就是 function 的「組合」,當你開始嘗試組合時會遇到許許多多的狀況,像是 function 寫得不夠好導致難以與其他 function 組合,以及該怎麼分解一個複雜的流程。這是一個漫長的過程,但你會慢慢領略 FP 真正想傳達給你的訊息,前面這些準備就是為了讓你在這步運用的靈活自如。 ### 瓶頸 而當我想學習 Functor、Monad 這些進階的概念時,我卻斷斷續續的卡了半年左右沒什麼進展,這中間我嘗試了很多,包含學習 Haskell、Category theory、觀看各種 Functor 跟 Monad 在 JS 的實作,但總覺得少了些什麼,似乎是我的理解方式錯了。 ### 重新思考 Functor、Monad 最近我開始重新審視這些我學到的名詞,也重看了幾部影片跟幾篇文章,我好像解開了那心中的結,而這個關鍵是跟數學跟程式各個名詞的混淆有關。 為何我會說跟名詞個混淆有關呢?那是因為我同時去讀了數學的概念並且去觀看了程式的實作,並且網路上有大量的文章跟影片把數學跟程式放在一起說明,讓你搞不清楚現在學的是數學還是程式,當然這並不是那些資源的錯,畢竟現代網路上本來就充滿了大量資源,自己本身就要訓練辦別對自己有利的資訊的能力。 你會常常看到 Functor、Monad、Maybe、Either、Maybe Functor、Either Monad 各種名詞換來換去,而這些就是造成了我混淆的原因。那我們該怎麼看待這個問題?是先學數學再寫程式嗎?還是先寫程式在學數學?其實都不是重點,我認為最重要的是區分數學跟程式的目的及關係。 ### 解開那心中的結 我們可以先想想 FP 是怎麼來的?為了讓程式更整潔更易讀,模仿數學的概念來思考程式的一種方法。基於這個想法我們再來看 Functor、Monad,這時候就要注意了,Functor 跟 Monad 是數學的名詞,跟程式本身並沒有太大關係,但我們為了利用 Functor 跟 Monad 的特性在程式裡創造出了各種 Type,像是 Option、Maybe、Either 等等,而這些 Type 都達成了 Functor 或 Monad 的定義/條件,進而達成了我們要的效果。 當你清楚了解之間的關係之後,你之後看到任何文章或影片你都能清楚的區分,知道是在教數學時就去看數學定義跟理論,如果是在教程式時就去了解程式跟哪個數學定理對應上了,並且明白了你現在使用的語言能詮釋 FP 的極限在哪,你不再糾結 Functor 應該是什麼,Monad 應該是什麼,而是你想利用這些特性達成什麼效果,當你到了這一步,你的思考就達到了另一個層次,而不被某些東西困住了。 ### 結語 雖然 FP 在某種程度上還算小眾,不過學習過程中讓我嘗試了更多我之前完全不會碰的領域,我學會看懂一些數學符號,學習了一點 Haskell 輔助我了解 FP 的思維,問題的分解跟重組的核心想法使我面對複雜問題都能冷靜思考。將最小部分功能處理好與另一個功能組合,並持續的堆疊,最後將會變成一個連你也無法想像的應用及壯舉。 #### 參考連結 這幾部影片或文章都是點醒我的一個關鍵,希望能幫助正在學習 FP 的朋友一些啟發,剛接觸的人看不懂很正常,當你在學習的路途中卡住再回來看一遍重新思考一遍,肯定有所收穫。 - [Brian Beckman: Don't fear the Monad](https://www.youtube.com/watch?v=ZhuHCtR3xq8) - [The Functional Programmer's Toolkit - Scott Wlaschin](https://www.youtube.com/watch?v=Nrp_LZ-XGsY) - [Functors, Applicatives, And Monads In Pictures](https://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up