首頁 > ���������������������������fp

���������������������������fp

互聯網 2021-07-28 05:43:03
面向對象和面向函數一直在爭論,實際上純粹的OOP和純粹的FP都是極端的,對於OOP來講:存在的並一定都是對象,函數就不是對象;對於FP來說:存在的並不總是純粹的,副作用總是真實存在。

What』s Wrong with OOP and FP提出了以上觀點。

首先,OOP錯在哪裡?

對於OOP來講:存在的並一定都是對象,函數就不是對象。

OOP是錯誤的,因為其定義「對象」企圖適應一切。當到了極致時便是「一切都是對象」。但這種觀念是錯誤的。

你可能會認為,在Python或Scala 函數也是對象。在Python中,每一個對象的方法的__call__是一個函數。同樣,在Scala中,對象的方法命名也適用函數。但經過一番深思熟慮,你會看到,這是混淆了傳遞和根本基礎兩個概念,函數才是根本基礎,而傳遞的是包裝它們的對象。Python和Scala只是綁架了函數,把它們打入了牢獄「對象」 ,然後給他們一個標籤是__call__或apply,然後再調用這些對象的方法。

當你包裝成函數成為一個對象時,你可以使用像一個對象去使用函數,但是這並不意味著你就可以說「函數也是對象」 。

大多數面向對象的語言也缺乏正確實現first-class的函數。一個極端是Java,不允許函數作為數據傳遞。您可以隨時用對象包裝函數,稱他們為「方法」 ,但正如我所說,這是綁架。first-class的缺乏是主要原因,為什麼在Java有這麼多的「設計模式」 。一旦你有first-class函數,您將不需要任何設計模式

其次,FP錯在哪裡?

FP是錯誤的,當你走到極端,變成一個純粹的函數性語言,也是錯誤的,見Amr Sabry :What is a Purely Functional Language

對於FP來說:存在的並不總是純粹的,副作用總是真實存在。

純粹函數語言試圖重新實現宇宙,通過將宇宙一切輸入輸出。但是真實世界和模擬之間有一個相差,副作用是真實世界的,它真實存在物理世界,當我們進行模擬計算是也是必不可缺少的,純函數模擬它們註定是低效的,複雜的,甚至是醜陋的。 Haskell的同樣是不正確的。

純粹的函數性語言造成了巨大的認知成本。如果你看看他們的深入,monads單子使程序複雜,很難寫,monad單子變壓器只是醜陋的黑客而已,monads同樣於設計模式,用單子代表副作用很類似用訪問者模式去寫解釋器一樣。

當你使用Haskell做事時,你有沒有注意到其他語言實現起來多麼容易嗎?

Amr Sabry可能是世界上最純粹的函數式編程語言知識最淵博的人,他通過一個小故事告訴我們:他們使事情不必要地複雜化。

有人說單子的價值是他們「劃去了」的副作用,但是單子不能使你的程序更容易分析或安全,這種劃去有什麼意義呢?

當然過度使用的副作用會讓程序更加難以分析,但你也可以在C語言中寫純函數:

int f(int x) {

int y = 0;

int z = 0;

y = 2 * x;

z = y + 1;

return z / 3;

}

你也可以使用彙編寫,純函數不只是屬於純函數語言,你可以在任何語言中編寫純函數,前提是,你得允許也能使用副作用。

回顧歷史,數學的理想主義是純粹的函數性語言的原動力。數學函數是簡單而美麗的,但不幸的是,只有當你的模型是純粹的,它們才工作得很好。否則,它變成難看。

不要害怕「範疇論」等流行語。我知道有相當數量的範疇論。即使類別理論家自己稱之為「抽象的廢話」 ,因為它基本上是一個怪誕的方式表達你已經知道的東西!如果你讀了Gottlob Frege弗雷格文章的函數和概念,你會驚奇地發現,大多數數學家在他寫作之前就得到了錯誤的函數,這大概已經追溯到一百年以前。事實上,數學家用其語言已經做了這麼多錯誤的事情,特別是微積分之類的東西。沒有理由今天編程語言的設計者應該盲目地學習數學。

[該貼被banq於2013-11-13 14:14修改過]

免責聲明:非本網註明原創的信息,皆為程序自動獲取互聯網,目的在於傳遞更多信息,並不代表本網贊同其觀點和對其真實性負責;如此頁面有侵犯到您的權益,請給站長發送郵件,並提供相關證明(版權證明、身份證正反面、侵權鏈接),站長將在收到郵件12小時內刪除。