所以函數式編程是什麼(ㄧ)

更新 發佈閱讀 4 分鐘

前面談了那麽多函數式編程與物件導向的差異,但我們還沒定義函數式編程。就像物件導向,函數式編程沒有明確的定義,每個人對於什麼是函數式編程都有不同的看法。在這裡我會總結前面的討論,給出我對於函數式編程的觀點。


物件導向注重封裝與延展性,因此一般基於三個機制:繼承、多型、封裝,它們代表了物件導向所重視的部分。而函數式編程著重於規則,認為規則的定義應該要明確且嚴格,因此它特別重視實現規則的機制。我認為的函數式編程則基於三個機制:類型、泛型、多型。


「類型」的機制指的是每個變數應該要有唯一的類型,它用來描述值的資料結構。它同時可以用來描述資料的意義,因此不是結構一樣就是相同的類型,也就是所謂的nominal type。函數式編程強調變數類型的明確性,因此不使用像是類別的抽象類型描述資料,而是透過多型描述抽象概念。相對地,為了讓類型具有延展性與可重用性,函數式編程使用複合類型組合多個類型,而非透過繼承延伸已有的類型。對於函數式編程,函式本身也有類型,而它只是其中一種複合類型而已,因此使用函式作為值使用是很正常的。函式的類型描述的是函式的行為,更廣義來說,函式的非同步標示符(async)、可拋出例外標示符(throws)等都可以算作函式類型的一部分。在Haskell則是使用Monad描述這些結構。總結來說,類型的職責是描述資料結構乃至程式結構,而非透明的特性能讓我們根據架構設計賦予這些結構唯一的語義。


「泛型」的機制透過參數化類型實現變數類型的抽象化。不同於物件導向的子類關係,它能保證類型之間的同調性,而這種同調性本身可以用來描述整體的結構。參數化的類型讓我們無法知道變數的具體類型,這使得我們必須以獨立於類型的方式處理它,除非程式語言本身允許實體類型檢查。這種必須與具體類型無關的限制形成對類型的抽象化,泛型本身並不能直接描述有意義的抽象類型,通常會搭配約束和多型的機制使用。如果程式語言不允許子類關係,那麽泛型就是唯一能使用非特定類型的方法,否則所有變數都只能有特定且具體的類型。對類型進行參數化代表把類型本身當作一種數值,並使用一個佔位符取代。更廣義的,不只有類型可以參數化,複合類型的建構子也能參數化,而它具有和類型不同的種類(kind),這種將類型作為值看待的方法使我們能更進一步地思考程式的抽象結構。總結前面的討論,泛型能將具體的結構從程式中抽離出來,變成可替換的抽象結構,這種特定的抽象就是這個機制的職責。


函數式編程的「多型」與物件導向的不同,它指的是特設多型,透過讓一個函式針對不同特定的類型做出不同的行為,讓我們可以描述抽象概念。特設多型能讓程式在不同地方對不同類型實作同一個概念,這為抽象概念提供擴展的能力。這種可擴展的語義讓我們無法直接透過具體類型決定函式的行為,因而形成抽象的概念。函數式編程的特設多型可以藉由對類型參數的約束實現,其中約束通常是使用介面/特性系統描述。對於不允許繼承和實體類型檢查的程式語言,這是唯一能讓同一個函式對不同類型具有不同行為的方法,而這與流程控制的分支不同,它的實際行為可以藉由實體化的類型決定,而不是在執行時期才決定。因此,多型的職責是為相同概念實現不同的行為,並讓我們在程式中實現與描述抽象概念。


函數式編程的這些機制與物件導向很像,但函數式編程的機制是根據能力和規則設計的,而非像是物件導向根據某種特定的面向設計,因此對於問題的解決方案比較不容易出現多種可能的實現方法。例如類型只能描述具體資料結構,不能描述抽象概念;泛型可以用來抽象化資料結構,但不會抹去類型資訊;多型必須藉由泛型與約束完成,它是唯一能實現擴展抽象概念的機制。而物件導向的一些機制對於函數式編程是多餘的,甚至是有害的。例如子類關係讓我們難以判斷變數是否是抽象的;變數的實體類型檢查讓泛型失去行為的一致性。相對的,函數式編程的機制之間的能力是沒有重合的,因此能將各自的能力發揮到極致。這種設計讓變數、函式、介面等編程實體僅具有最少的能力,使得我們能更準確掌握各個部分的程式碼能做什麼和該做什麼。這種最小化能力、最大化用處的設計就是我認為的函數式編程最重要的原則,而這三個機制從語言級別上遵從與支援這個原則。

留言
avatar-img
have bear的沙龍
4會員
28內容數
這不是教你如何從物件導向到函數式編程的入門教程。我會深入探討物件導向與函數式編程的差異,並討論為什麼你應該使用函數式編程並徹底放棄物件導向。
have bear的沙龍的其他內容
2024/02/15
這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,
2024/02/15
這個系列的文章主要專注於物件導向到函數式編程的差異與分析,並針對概念與機制上的不同進行比較。很多人說物件導向和函數式編程沒有哪個比較好的問題,只有哪個比較適合的問題,然而我並不這麼認為,我透過這一系列的文章從各個角度討論它們之間的優缺點就是為了闡述我的觀點。物件導向錯在沒有理論基礎,但它贏在熟悉性,
2024/02/08
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
2024/02/08
前一篇文章中所提的函數式的三個機制明確說明了它關注的規則與能力具體是什麼。然而這套對於函數式編程的定義主要基於特定的類型系統,作為一個編程範式來說過於狹隘(物件導向的定義也是這樣)。更廣義的,我認為函數式編程主要依循三個原則,它們可以應用於任何程式語言,就算沒有靜態類型系統的支援也可以。例如在不管類
2024/02/02
說到物件導向就必須提五個原則,統稱SOLID,它被認為是物件導向的重要概念。這五個原則並不只適用於物件導向,事實上它很像函數式編程的習慣。它的命名很奇怪且容易讓人混淆,所以我會用我自己的翻譯解釋。 Single Responsibility Principle 是「單一職責原則」,認為一個模組
2024/02/02
說到物件導向就必須提五個原則,統稱SOLID,它被認為是物件導向的重要概念。這五個原則並不只適用於物件導向,事實上它很像函數式編程的習慣。它的命名很奇怪且容易讓人混淆,所以我會用我自己的翻譯解釋。 Single Responsibility Principle 是「單一職責原則」,認為一個模組
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
2.0 上古漢語的特殊結構 2.3 之乎者也 —  也 (矣﹑焉) 2.3.1 也 一﹕初探之四 現在讓我們從函數引申出來的函子/論元觀點來解析上述「也」字的用法。用初級計算機科學編程的語言來說,函子就是一個具有函數功能的物件 (object),方便我們使用﹔它的功能就是讓我們可以召喚
Thumbnail
2.0 上古漢語的特殊結構 2.3 之乎者也 —  也 (矣﹑焉) 2.3.1 也 一﹕初探之四 現在讓我們從函數引申出來的函子/論元觀點來解析上述「也」字的用法。用初級計算機科學編程的語言來說,函子就是一個具有函數功能的物件 (object),方便我們使用﹔它的功能就是讓我們可以召喚
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 四 在以語構範疇為單位的語言結構上,同樣可以應用前述的函數概念或規則。其中一個最大的分別是,若以 1.4.2_4 為用作對比的例子,函算語法的論域 (domain of dis
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 四 在以語構範疇為單位的語言結構上,同樣可以應用前述的函數概念或規則。其中一個最大的分別是,若以 1.4.2_4 為用作對比的例子,函算語法的論域 (domain of dis
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 三 弗雷格從語言結構的觀點出發,提出了函數可以被視為一個不完整的表式。如果我們將一個函數拆解為一個由一個函子及其 (一個或多個) 論元所組成的表式,那麼該函子便是一個有待滿足的
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 三 弗雷格從語言結構的觀點出發,提出了函數可以被視為一個不完整的表式。如果我們將一個函數拆解為一個由一個函子及其 (一個或多個) 論元所組成的表式,那麼該函子便是一個有待滿足的
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 二 關於函數的演變和弗雷格對函數的看法,前面的 1.2 節和 1.3 節已經談論了不少。 由於函數在數學﹑邏輯學﹑計算語言學極為重要,更且是本書闡述的語法的中心概念,因此有必要再略作
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 二 關於函數的演變和弗雷格對函數的看法,前面的 1.2 節和 1.3 節已經談論了不少。 由於函數在數學﹑邏輯學﹑計算語言學極為重要,更且是本書闡述的語法的中心概念,因此有必要再略作
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 一 上節是對語構範疇理論的簡介。 1922年,列希涅夫斯基提出了語構範疇概念,以此取代人工化的型論,並引入到他的三個形式系統中66,以圖避免羅素悖論及其它集論悖論的出現。 艾杜
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 1.4.2 函算語法與函數概念 一 上節是對語構範疇理論的簡介。 1922年,列希涅夫斯基提出了語構範疇概念,以此取代人工化的型論,並引入到他的三個形式系統中66,以圖避免羅素悖論及其它集論悖論的出現。 艾杜
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動 1.2.6熱的傳導 二 傅立葉認為他的結果對任一函數皆有效,並將函數定義為 (FF) 在一般情況下,函數
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動 1.2.6熱的傳導 二 傅立葉認為他的結果對任一函數皆有效,並將函數定義為 (FF) 在一般情況下,函數
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動  七 雖然論爭沒有得出任何定論,但對函數概念的演化卻影嚮頗深。 在這次歷時多年的論爭中,函數概念得以擴大而包括
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動  七 雖然論爭沒有得出任何定論,但對函數概念的演化卻影嚮頗深。 在這次歷時多年的論爭中,函數概念得以擴大而包括
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 五 特朗貝爾依循當時數學界對函數的普遍理解,視「函數」為任一分析式。 但這時的歐拉宣稱函數不必是正常意義下的
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 五 特朗貝爾依循當時數學界對函數的普遍理解,視「函數」為任一分析式。 但這時的歐拉宣稱函數不必是正常意義下的
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 數學中函數概念的重要性難以盡書,亦很難想像沒有函數概念的數學可以走多遠。誇張一點,我們可以說很大部份的數學都是按函數概念操作的。但少有人留意到,在某個意義上,函數可說是數學語言的一個語構處理。 漢語「函數」一詞乃
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 數學中函數概念的重要性難以盡書,亦很難想像沒有函數概念的數學可以走多遠。誇張一點,我們可以說很大部份的數學都是按函數概念操作的。但少有人留意到,在某個意義上,函數可說是數學語言的一個語構處理。 漢語「函數」一詞乃
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News