這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,人們認為它比較好只是因為我們害怕學習新知識,只是因為我們不去思考背後的道理。函數式編程需要的前置條件對於大部分程式設計師太過苛刻,而且它的編程風格與設計理念跟物件導向有所差距,這使得我們需要換個腦袋才有辦法改用函數式編程寫程式。學習函數式編程需要的是對於程式的基礎概念的重新思考,透過重新檢視習以為常的事物才能發現其中的問題。
函數式編程還有很多部分可以討論,但它以超出物件導向所能觸及的範圍,未來有機會再討論。在此僅提幾個關鍵字以便有興趣的讀者搜尋。跟函子有關的概念:functor, applicative, monad, alternative,其中monad是很重要的概念,基礎的monad包括maybe/either, list, rws, io等,而函式庫parsec是一個很有名的應用。另外續體continuation被稱為monad之母,它與continuous passing style有一點關係,ocaml的effect handler就是基於續體實現的。monad的組合在Haskell是使用monad transformer,它顯示了monad本身難以組合的問題,因此才有effect handler的出現。另一種實現有副作用的操作的方法是arrow。我對於monad有自己的看法,未來有機會再討論。monad的相反是comonad,我並沒有很了解這個概念,reactivity似乎跟它有關。跟list有關的操作包含foldable, traversable,其中常與代數結構monoid, heyting algebra等一起使用。lens可以用來存取特定欄位的資料,而zipper則可以重新定向資料結構的根。另外一種方法是differentiation,它把微分的概念帶到代數資料結構上,用來描述帶有洞的資料結構。
lambda calculus是必學的概念,還有一個更特殊好用的是interaction calculus。Church encoding和Scott encoding等展示了lambda calculus的強大。Haskell跟其他純函數式的程式語言不一樣的地方是laziness,這使得它的思考方式很不一樣。但它並沒有特別在乎totality,因此必須小心一些陷阱。相對地,idris2注中totality,甚至要求我們提供證明,這是使用dependent type達成的技術。Haskell可以透過擴展使用higher rank type,這可以做到一些特殊的操作。react的diff算法也是基於純函數式的特性。我最近在研究graph edit script相關的方法,函數式的做法非常有趣。還有type level programming, tagged union, template and tactic metaprogramming, functional dependency, type family, attributes等概念,族繁不及備載。大部分內容都可以在https://en.m.wikibooks.org/wiki/Haskell找到。