函數式編程語言
函數式編程語言是那些方便于使用函數式編程范式的語言。簡單來說,如果具備函數式編程所需的特征, 它就可以被稱為函數式語言。在多數情況下,編程的風格實際上決定了一個程序是否是函數式的。
是什么讓一個語言具有函數式特征?
函數式編程無法用C語言來實現。函數式編程也無法用Java來實現(不包括那些通過大量變通手段實現的近似函數式編程)。 這些語言不包含支持函數式編程的結構。他們是純面向對象的、嚴格非函數式的語言。
同時,純函數語言也無法使用面向對象編程,比如Scheme、Haskell以及Lisp。
然而有些語言兩種模式都支持。Python是個著名的例子,不過還有別的:Ruby,Julia,以及我們最感興趣的Javascript。 這些語言是如何支持這兩種差別如此之大的設計模式呢?它們包含兩種編程范式所需要的特征。 然而對于Javascript來說,函數式的特征似乎是被隱藏了。
但實際上,函數式語言所需要的比上述要多一些。到底函數式語言有什么特征呢?
特點 | 命令式 | 函數式 |
---|---|---|
編程風格 | 一步一步地執行,并且要管理狀態的變化 | 描述問題和和所需的數據變化以解決問題 |
狀態變化 | 很重要 | 不存在 |
執行順序 | 很重要 | 不太重要 |
主要的控制流 | 循環、條件、函數調用 | 函數調用和遞歸 |
主要的操作單元 | 結構體和類對象 | 函數作為一等公民的對象和數據集 |
函數式語言的語法必須要顧及到特定的設計模式,比如類型推斷系統和匿名函數。大體上,這個語言必須實現lambda演算。 并且解釋器的求值策略必須是非嚴格、按需調用的(也叫做延遲執行),它允許不變數據結構和非嚴格、惰性求值。
- 譯注:這一段用了一些函數式編程的專業詞匯。lambda演算是一套函數推演的形式化系統(聽起來很暈), 它的先決條件是內部函數和匿名函數。非嚴格求值和惰性求值差不多一個意思,就是并非嚴格地按照運算規則把所有元素先計算一遍, 而是根據最終的需求只計算有用的那一部分,比如我們要取有一百個元素的數組的前三項, 那惰性求值實際只會計算出一個具有三個元素是數組,而不會先去計算那個一百個元素的數組。
新聞熱點
疑難解答
圖片精選