函式式程式設計裡functor到底該怎麼理解?

時間 2021-05-09 15:57:15

1樓:Jason Hu

帶type system的函式式程式設計的核心就是(數學)結構。也就是說,你的程式是不同結構之間的互動,你如果理解了這一點,函式式程式設計裡的所有概念都會很容易理解。

比方說,你可以實現乙個加一的函式(1

+)那麼你傳入任何整數都會加上1。

listOfInt::[

Int]

listOfInt

=...

如果你寫(1

+)listOfInt

這肯定是行不通的。但是除開編譯器錯誤,你是否能理解這個操作應該做些什麼呢?你有一些整數,你往上加一,這目的很明顯了,就是為了讓所有的整數都加上1。

以下兩種寫法都是一樣的(1

+)<$>listOfInt

fmap(1

+)listOfInt

注意到,這個應該反映一種直覺。就算你不完全理解函式式程式設計,你其實對資料的組織帶有結構性的期望。這是最重要的。

再舉個例子,Maybe有Just和Nothing兩個constructor,它表示0或者乙個資料。

maybeInt

::Maybe

IntmaybeInt

=...

那個如果我想說(1

+)maybeInt

你是否可以理解這個操作的目的是什麼呢?

理解Functor你不用理解什麼category theory。我甚至認為如果你僅僅是為了理解函式式的程式而去學習大量的數學,這是真的本末倒置。你只需要意識到程式裡的結構和知道Functor保留你的程式結構就可以了。

2樓:

functor來自於範疇論的函子, 表示範疇之間的對映。以Haskell為例,各種物件之間都屬於Hask範疇,那麼你寫出來的函式/statement自然是這個Hask範疇下的自函子。

3樓:

以前我也覺得這東西奇怪,後來無意中在本科的一本數學教材上看到一節《範疇和函子》,讀了一下發現數學中的這個函子和 Haskell 中的函子是一樣的,然後就立即明白了為什麼 Haskell 中的函子需要乙個 fmap。這種情況下只看程式語言可能只能形成乙個模糊的概念,但如果到數學中尋找原本的定義,就可能看得更清楚。所以我建議你去看一下數學。

補充:1、單純的範疇和函子的概念非常簡單。只看這兩個概念的話,大概幾分鐘就能看完。

2、那本教材是包志強的《點集拓撲與代數拓撲引論》,但我覺得找本專門介紹範疇理論的書應該更好。

函式式程式設計(Functional Programming)相比物件導向程式設計(Object oriented Programming)有哪些優缺點?

綠巨人 給乙個FP和OOP的不同之處。介面的使用中,會涉及到四個角色 介面,實現者,介面使用者,物件建立者。我們看這個四個角色的出現的先後次序。在OOP中,出現的次序是 介面 介面使用者 實現者 物件建立者。實現者必須晚於介面,OOP想 這不是廢話嗎?在FP中 實現者可以在介面之前出現 以Go語言為...

怎麼學習函式式程式設計

曹上 可以看coursera上面的programming language和function programming in scala edx上introduction to function programming 和 How to code系列 Tie Cheng 我們寫OCaml。乙個思路是,...

函式式程式設計中cps(continuation passing style )是什麼意思?

借用wiki books的說法,CPS是把f a a 變換成 f cps a a r r 最後不是返回值,而是返回乙個傳入了返回值的資料對映關係 函式 灼弦 Belleve的回答太抽象了,沒邏輯背景的人看不懂,我在Quora上看到乙個回答寫得挺好的,裡面從邏輯學的角度解釋的一節或許可以作為 Bell...