重新思考 FP

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

最近我開始重新審視這些我學到的名詞,也重看了幾部影片跟幾篇文章,我好像解開了那心中的結,而這個關鍵是跟數學跟程式各個名詞的混淆有關。

為何我會說跟名詞個混淆有關呢?那是因為我同時去讀了數學的概念並且去觀看了程式的實作,並且網路上有大量的文章跟影片把數學跟程式放在一起說明,讓你搞不清楚現在學的是數學還是程式,當然這並不是那些資源的錯,畢竟現代網路上本來就充滿了大量資源,自己本身就要訓練辦別對自己有利的資訊的能力。

你會常常看到 FunctorMonad、MaybeEitherMaybe FunctorEither Monad 各種名詞換來換去,而這些就是造成了我混淆的原因。那我們該怎麼看待這個問題?是先學數學再寫程式嗎?還是先寫程式在學數學?其實都不是重點,我認為最重要的是區分數學跟程式的目的及關係。

解開那心中的結

我們可以先想想 FP 是怎麼來的?為了讓程式更整潔更易讀,模仿數學的概念來思考程式的一種方法。基於這個想法我們再來看 FunctorMonad,這時候就要注意了,FunctorMonad 是數學的名詞,跟程式本身並沒有太大關係,但我們為了利用 FunctorMonad 的特性在程式裡創造出了各種 Type,像是 OptionMaybeEither 等等,而這些 Type 都達成了 FunctorMonad 的定義/條件,進而達成了我們要的效果。

當你清楚了解之間的關係之後,你之後看到任何文章或影片你都能清楚的區分,知道是在教數學時就去看數學定義跟理論,如果是在教程式時就去了解程式跟哪個數學定理對應上了,並且明白了你現在使用的語言能詮釋 FP 的極限在哪,你不再糾結 Functor 應該是什麼,Monad 應該是什麼,而是你想利用這些特性達成什麼效果,當你到了這一步,你的思考就達到了另一個層次,而不被某些東西困住了。

結語

雖然 FP 在某種程度上還算小眾,不過學習過程中讓我嘗試了更多我之前完全不會碰的領域,我學會看懂一些數學符號,學習了一點 Haskell 輔助我了解 FP 的思維,問題的分解跟重組的核心想法使我面對複雜問題都能冷靜思考。將最小部分功能處理好與另一個功能組合,並持續的堆疊,最後將會變成一個連你也無法想像的應用及壯舉。

參考連結

這幾部影片或文章都是點醒我的一個關鍵,希望能幫助正在學習 FP 的朋友一些啟發,剛接觸的人看不懂很正常,當你在學習的路途中卡住再回來看一遍重新思考一遍,肯定有所收穫。