函數式編程為何越來越受到重視

火星人 @ 2014-03-12 , reply:0


  

 

 函數式編程受到越來越多的關注,軟體架構師Neal Ford分析了其中的原因。

Neal Ford首先強調,函數式編程的特點之一是存在強大的抽象,它隱藏了許多日常操作的細節(比如迭代)。用抽象來處理迭代等任務,使得需要維護的代碼變得更少,因此可能出現錯誤的地方也就更少。

Java 開發人員習慣於框架 級別的重用;在面向對象的語言中進行重用所需的必要構件需要非常大的工作量,他們通常會將精力留給更大的問題。函數式語言在更細化的級別提供重用,在列表和映射等基本數據結構之上通過高階函數提供定製,從而實現重用。

在面向對象的命令式編程語言中,重用的單元是類以及與這些類進行通信的消息,這些信息是在類圖中捕獲的。在 OOP 的世界中,鼓勵開發人員創建獨特的數據結構,以方法的形式附加特定的操作。

函數式編程語言嘗試採用不同的方式來實現重用。它們更喜歡一些關鍵的數據結構(如列表、集和映射),並且在這些數據結構上採用高度優化的操作。傳遞數據結構和高階函數,以便 “插入” 這種機制,針對某一特定用途對其進行定製。

函數級的封裝支持在比構建自定義類結構更細的基礎級別上進行重用。此方法的優勢之一已經體現在 Clojure 中。最近,庫中的一些巧妙創新重寫了 map 函數,使它可以自動并行化,這意味著所有映射操作都可以受益於沒有開發人員干預的性能提升。

Neal Ford舉了一個解析 XML 的例子。大量的框架可用於在 Java 中完成這個任務,每個框架都有自定義的數據結構和方法語義(例如,SAX 與 DOM)。

Clojure 將 XML 解析為一個標準的 Map 結構,而不是強迫您使用自定義的數據結構。因為 Clojure 中包含大量與映射配合使用的工具,如果使用內置的列表理解函數 for,那麼執行 XPath 樣式的查詢就會很簡單。

最初,Clojure 中令人生畏的細節之一是:與映射和其他核心數據結構進行交互的方法似乎有無限多種。然而,它反映了這樣一個事實:在 Clojure 中,大多數內容都嘗試解決這些核心的、優化的數據結構。它沒有將解析的 XML 困在一個獨特的框架中,相反,它試圖將其轉換為一個已存在相關工具的現有結構。

其次,函數式編程提供了新的工具類型,以優雅的方式解決棘手的問題。例如,Java 開發人員不習慣盡能延遲生成其值的惰性 數據結構。而未來的函數式語言將對這種高級特性提供支持,一些框架將此功能加裝到 Java 中。

第三點是讓語言遷就問題,大多數開發人員都將他們的工作誤解為接受一個複雜的業務問題,將它轉換成 Java 等語言。

他們的這種誤解是因為 Java 並不是一種特別靈活的語言,它迫使您讓自己的想法適應於已經存在的剛性結構。但是,當開發人員使用可塑語言時,他們看到了讓語言遷就問題,而不是讓問題遷就語言的機會。像 Ruby(它為領域特定語言 (DSL) 提供了比主流更友好的支持)等語言證明了這種潛在可能。現代函數式語言甚至走得更遠。Scala 旨在協調內部 DSL 的託管,並且所有 Lisp(包括 Clojure)都可以提供無與倫比的靈活性,使開發人員能夠讓語言適應問題。

最後一點是與語言的趨勢相一致,函數式編程的目標之一是最大程度地減少可變狀態。像垃圾收集一樣,現在緩存也可以降級用於語言。

由於運行時獲得了更多的能力並且有多餘的開銷,開發人員可以將繁忙的工作割讓給語言,將我們解放出來,去思考更重要的問題。Groovy 中的備忘功能就是眾多示例中的一個;因為基礎運行時允許這樣做,所有現代語言都添加了函數式構造,包括 Totally Lazy 等框架。

微軟的函數式編程語言F#最近隨Visual Studio 2013預覽版發布了3.1版本。3.1版的主要新增語言特性:

  • 命名的聯合類型欄位——現在可以為每個聯合類型中的聯合欄位命名
  • 數組切片擴展——之前的數組切片只能用於同等維度的數組,現在這不是必須的了
  • 為LINQ風格的方法增強了類型推斷——改進了F#中使用函數作為參數的重載方法的類型推斷
  • 支持第一個參數為類型參數的C#風格的擴展方法——3.1支持使用擴展方法(this關鍵字),比如:static member M<T>(this T input, T other)
  • 在特性和字面量表達式中對常量進行組合——比如,可以使用“+”來連接字元串,或對枚舉標記進行按位OR操作(|||)





[火星人 via ] 函數式編程為何越來越受到重視已經有193次圍觀

http://www.coctec.com/docs/program/show-post-71272.html