函數式編程之後

更新於 2024/02/15閱讀時間約 3 分鐘

這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,人們認為它比較好只是因為我們害怕學習新知識,只是因為我們不去思考背後的道理。函數式編程需要的前置條件對於大部分程式設計師太過苛刻,而且它的編程風格與設計理念跟物件導向有所差距,這使得我們需要換個腦袋才有辦法改用函數式編程寫程式。學習函數式編程需要的是對於程式的基礎概念的重新思考,透過重新檢視習以為常的事物才能發現其中的問題。


函數式編程還有很多部分可以討論,但它以超出物件導向所能觸及的範圍,未來有機會再討論。在此僅提幾個關鍵字以便有興趣的讀者搜尋。跟函子有關的概念: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找到。

avatar-img
4會員
28內容數
這不是教你如何從物件導向到函數式編程的入門教程。我會深入探討物件導向與函數式編程的差異,並討論為什麼你應該使用函數式編程並徹底放棄物件導向。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
have bear的沙龍 的其他內容
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
前面談了那麽多函數式編程與物件導向的差異,但我們還沒定義函數式編程。就像物件導向,函數式編程沒有明確的定義,每個人對於什麼是函數式編程都有不同的看法。在這裡我會總結前面的討論,給出我對於函數式編程的觀點。 物件導向注重封裝與延展性,因此一般基於三個機制:繼承、多型、封裝,它們代表了物件導向所重
說到物件導向就必須提五個原則,統稱SOLID,它被認為是物件導向的重要概念。這五個原則並不只適用於物件導向,事實上它很像函數式編程的習慣。它的命名很奇怪且容易讓人混淆,所以我會用我自己的翻譯解釋。 Single Responsibility Principle 是「單一職責原則」,認為一個模組
讓我在這篇文章總結一下前面對物件導向設計的討論,我們討論了物件導向的四個特性:繼承、抽象、多型、封裝,分析了它們的問題,並跟函數式編程的思維做比較。我們引入了與之相對應的特性:泛型、特性系統、模組化,有些特性雖然跟那四個特性很像,但在一些細微的地方有不同的詮釋,使得整體思考方式很不一樣。 「繼
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
上一篇文章提到有些介面不應被繼承,但物件導向的子類別只能繼承父類別的介面,因而產生一些不合適的介面實作。trait/typeclass則沒有這種繼承機制,這似乎使需要繼承的特性無法直接使用。然而函數式導向比起繼承,更適合使用組合,根本不需要使用繼承疊加特性。 資料類型的定義往往跟怎麼建構模型相
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
前面談了那麽多函數式編程與物件導向的差異,但我們還沒定義函數式編程。就像物件導向,函數式編程沒有明確的定義,每個人對於什麼是函數式編程都有不同的看法。在這裡我會總結前面的討論,給出我對於函數式編程的觀點。 物件導向注重封裝與延展性,因此一般基於三個機制:繼承、多型、封裝,它們代表了物件導向所重
說到物件導向就必須提五個原則,統稱SOLID,它被認為是物件導向的重要概念。這五個原則並不只適用於物件導向,事實上它很像函數式編程的習慣。它的命名很奇怪且容易讓人混淆,所以我會用我自己的翻譯解釋。 Single Responsibility Principle 是「單一職責原則」,認為一個模組
讓我在這篇文章總結一下前面對物件導向設計的討論,我們討論了物件導向的四個特性:繼承、抽象、多型、封裝,分析了它們的問題,並跟函數式編程的思維做比較。我們引入了與之相對應的特性:泛型、特性系統、模組化,有些特性雖然跟那四個特性很像,但在一些細微的地方有不同的詮釋,使得整體思考方式很不一樣。 「繼
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
上一篇文章提到有些介面不應被繼承,但物件導向的子類別只能繼承父類別的介面,因而產生一些不合適的介面實作。trait/typeclass則沒有這種繼承機制,這似乎使需要繼承的特性無法直接使用。然而函數式導向比起繼承,更適合使用組合,根本不需要使用繼承疊加特性。 資料類型的定義往往跟怎麼建構模型相
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
前陣子旅遊了一趟,加上身體違和,因此一陣子沒有更新,今天來談談這組10/6出的非農數據。   先講結論: (1)這數據沒有表面上來的強勁,美國的勞動力市場是在顯著的趨緩。 (2)美股跟債券市場其實都有恰如其分的表現。股漲債跌很合理。   先談談這個非農數據。 我們還是得再次科普一下這數
Thumbnail
高效生活,幫助你找回更多自己的時間 哈囉,這裡是 AL 的 Googlesheet 學習筆記 本系列文章,會帶你認識各種函數,學習並應用於日常,加速生活與工作、提升效率 今天要介紹的函數是 ARRAYFORMULA
Thumbnail
雙11要到了,單身女子們還沒想到要送什麼禮物給自己的話,不妨送給自己一套韓式婚紗照,單身更要展現生活的精彩與燦爛,不論是成年禮紀念,或實現公主夢,當一日封面女主角吧!
Thumbnail
如果建築蓋好後就變成固定公式,那把不同的時間當作函數放進去,會跑出各自獨立的模樣。清晨,傍晚,晴朗,陰雨,然後四季,累積成深淺不一的記憶。
Thumbnail
這篇文章將介紹給你一套我一直在使用的寫作方法,讓你迅速取捨寫作的候選內容,快速搭建寫作草稿的有效框架。而我後來也逐漸領悟出了一個框架系統,我稱其為「函式寫作法」。 函式寫作法 = 自數據+演算法+返回值。
Thumbnail
不知不覺寫到第七篇了!QUERY 真的有好多好多東西可以說 (ノ>ω<)ノ QUERY 其實還能處理有日期、時間的資料,而且語法也相當容易,和我們之前就看過的聚集函式很像。你如果會了之前的聚集函式,相信這次處理日期和時間也會對你來說很簡單!
Thumbnail
最近on檔,又常被拿來比較的兩齣戲【二十五,二十一】與【氣象廳的人們:社內戀愛殘酷史篇】你看了嗎? 今天就先來聊聊【氣象廳的人們:社內戀愛殘酷史篇】以下簡稱【氣象廳的人們】: 第八集中,接近梅雨季前的悶熱天氣,令人不適, 也容易讓人因為炎熱而煩躁,當遇到不順暢的心情,就很容易爆發。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Python 提供了一系列內建函式,其中一部分涉及數學和數學操作。 以下是一些常用的內建函式和數學相關的函式: 基本數學運算: abs(x): 返回 x 的絕對值。 result = abs(-5) print(result) # 輸出: 5 max(iterable) 和 min(
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
前陣子旅遊了一趟,加上身體違和,因此一陣子沒有更新,今天來談談這組10/6出的非農數據。   先講結論: (1)這數據沒有表面上來的強勁,美國的勞動力市場是在顯著的趨緩。 (2)美股跟債券市場其實都有恰如其分的表現。股漲債跌很合理。   先談談這個非農數據。 我們還是得再次科普一下這數
Thumbnail
高效生活,幫助你找回更多自己的時間 哈囉,這裡是 AL 的 Googlesheet 學習筆記 本系列文章,會帶你認識各種函數,學習並應用於日常,加速生活與工作、提升效率 今天要介紹的函數是 ARRAYFORMULA
Thumbnail
雙11要到了,單身女子們還沒想到要送什麼禮物給自己的話,不妨送給自己一套韓式婚紗照,單身更要展現生活的精彩與燦爛,不論是成年禮紀念,或實現公主夢,當一日封面女主角吧!
Thumbnail
如果建築蓋好後就變成固定公式,那把不同的時間當作函數放進去,會跑出各自獨立的模樣。清晨,傍晚,晴朗,陰雨,然後四季,累積成深淺不一的記憶。
Thumbnail
這篇文章將介紹給你一套我一直在使用的寫作方法,讓你迅速取捨寫作的候選內容,快速搭建寫作草稿的有效框架。而我後來也逐漸領悟出了一個框架系統,我稱其為「函式寫作法」。 函式寫作法 = 自數據+演算法+返回值。
Thumbnail
不知不覺寫到第七篇了!QUERY 真的有好多好多東西可以說 (ノ>ω<)ノ QUERY 其實還能處理有日期、時間的資料,而且語法也相當容易,和我們之前就看過的聚集函式很像。你如果會了之前的聚集函式,相信這次處理日期和時間也會對你來說很簡單!
Thumbnail
最近on檔,又常被拿來比較的兩齣戲【二十五,二十一】與【氣象廳的人們:社內戀愛殘酷史篇】你看了嗎? 今天就先來聊聊【氣象廳的人們:社內戀愛殘酷史篇】以下簡稱【氣象廳的人們】: 第八集中,接近梅雨季前的悶熱天氣,令人不適, 也容易讓人因為炎熱而煩躁,當遇到不順暢的心情,就很容易爆發。