函數式語言具體應用是什麼?

參見這題:什麼是函數式語言?

最高票的回答中提到,對象之間邊界模糊的時候,函數型更擅長. 這一點聽起來比較模糊,誰能給一個具體點兒的例子嗎?


有很多東西天生就是函數式的,至於我們為什麼不用函數式語言來實現,通常只是基於性能方面的原因。畢竟你只要你不怕吃苦,花費無限的精力來優化他,函數式的語言再怎麼優化也不如你做得好,因為他們優化的目標是讓程序寫起來爽,而你優化的目標是超過他們。無論你用什麼函數式語言來做適合他做的東西,你都可以用C++把它做得更好 —— 只要你肯學習。所以當你看到一個語言的優點是讓你寫起來爽,那他多半是犧牲了性能的,當然前提是你跟創造那個語言的人不相上下。

那到底什麼是天生函數式的東西呢,我就不展開了,具體來說有如下幾個方面

1:軟體渲染器

2:編譯器

3:決策支持系統

4:資料庫的query plan optimization部分

5:通過數據結構生成一個HTML頁面

6:ERP裡面跟排課演算法類似的東西

7:etc

綜合起來,他們都有如下幾個特徵:問題的重點是計算而不是IO計算是樹結構而且是遞歸的。連我認識的幾個圖形學大牛都說函數式語言寫起渲染器簡直是簡單無比。不過他們為什麼還是要用C++還是DirectCompute來痛苦的實現他們呢?你們好好想想。


謝邀。這段話是我寫的,我解釋一下自己(可能並不正確)的看法。

這個說法來自 SICP (計算機程序的構造和解釋) 的第三章結尾:3.5.5 函數式程序的模塊化和對象的模塊化:

本章開始時提出了一個目標,那就是構造出一些計算模型,使其結構能夠符合我們對於試圖去摸擬的真實世界的看法。我們可以將這一世界模擬為一集相互分離的、 受時間約束的、具有狀態的相互交流的對象,或者可以將它模擬為單一的、 無時間也無狀態的統一體。每種觀點郁有其強有力的優勢。但就其自身而言,又沒有一種方式能夠完全令人滿意。我們還在等待著一個大統一的出現[1]。

[1] 對象模型對世界的近似在於將其分割為獨立的片斷,函數式模型則不是沿著對象間的邊界去做模塊化。當「對象"之間不共享的狀態遠遠大於它們所共享的狀態時,對象模型就特別好用。這種對象觀點失效的一個地方就是量子力學。在那裡,將物體著作獨立的粒子就會導致悖論和混亂。將對象觀點與函數式觀點合併可能與程序設計的關係不大,而是與基本認識論有關的論題 。

簡單來講,當你用程序對日常生活的用品,比如桌子、板凳建立計算模型的時候,用創建對象的方式是自然而然的想法,因為它們的根本屬性是相對獨立的。但如果引入現實中的時間概念 —— 這是無法避免的,除非人類明白時間的真實含義 —— 事情有了先後順序,對象之間有了基於時間的依賴關係:時間的引入導致了並發的執行過程,告訴我,除了眾所周知的鎖,你有更好的解決方法嗎?

SICP 裡面介紹了一種 stream 技術,將時間「消掉」了,就像我們解方程的時候,幸喜地發現某個未知變數居然能夠在等式兩邊消去!但這種技術並不是終極解決方法,對時間並發性本質上的難度無能為力。


excel


推薦閱讀:

自學函數式語言(特指Haskell)需要什麼條件?
如果讓你來重新設計(或者改造)Haskell,你打算怎麼設計或者修改?
Hindley-Milner 是什麼以及函數式編程中它的用途是什麼?
柯里化在工程中有什麼好處?
什麼是函數式語言?

TAG:編程語言 | 函數式編程 |