函數式編程(Functional Programming),一看這個詞,簡直就是學院派的典範。前端
以致於從 Lisp 的創世,到 Scheme、Haskell、Clean、Erlang、Miranda、Scala、LOGO、Clojure、Mathematica 甚至 R,它們一出生就站在了鄙視鏈的頂端,尤爲是非純函數式的 Lisp 老祖和純函數式的集大成者 Haskell。就如段子裏說的,一羣程序員自我介紹,當聽到「我是寫 Lisp 的…」這一句,全部人的注意力都會被吸引。簡直是衆多程序員想要裝逼的頂峯,可見一斑。程序員
學院派的語言方法彷佛只有大學研究裏纔會使用,但隨着技術和時代的發展,JavaScript,這種典型的多範式編程語言,也由面向對象爲絕對主導逐漸歸入各類函數式編程的特性,這兩年的 React、TypeScript、Immutable、underscore、Elm 等等,紛紛加入了函數式編程的大潮。因此這期週刊,咱們就重點引入 JavaScript 的函數式編程,淺入淺出,一窺函數式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。編程
1. 什麼是函數式編程?segmentfault
JavaScript 函數式編程(一) 丨 JavaScript 函數式編程(二) // 王偉嘉設計模式
這兩篇將 JS 函數式編程的典型特性「1. 純函數概念,函數柯里化和函數的組合;2. 容器和 Functor,Maybe,Monad,Either 以及 IO」由淺及深,一個個地作了介紹,很是不錯的入門文章。數組
「所謂的純函數就是,對於相同的輸入,永遠會獲得相同的輸出,並且沒有任何可觀察的反作用,也不依賴外部環境的狀態。」閉包
2. 函數式思想的理解編程語言
《JavaScript 函數式編程》讀書筆記 // homkeride
這是做者對《JavaScript 函數式編程》的理解,JS 爲何要用函數式編程(數據和行爲的關係、專一於過程自己),如何使用函數式編程(一等公民、純函數、可組合、高階函數、基於流的編程),可讓你更深刻地理解 JS 大量引入函數式方法的思想。函數式編程
如今,來進行更細節的分析和理解
展示另外一面的函數式編程思惟:強調將程序狀態變化(即反作用 side effect)的次數減到最小,鼓勵使用不可變數據(immutable data)和純函數(pure functions)(「純」意味着沒有反作用的),更傾向於使用聲明式的風格(讓代碼更乾淨,可讀性更強,推理起來更簡單)。
3. 特性各個瞭解
示例代碼清晰,簡單明瞭,讓你快速瞭解 FP 的諸多特性,接下來,再一一分解。
前面提到的純函數、函數柯里化、函數的組合、偏函數、容器、Functor、Monad、IO 等等,這裏都有分別的詳細講解。
4. 各 JS 方言都有了哪些實踐?
「談到函數式編程時,可能常被提到的是機制、方法,而不是核心原則。但從根本上來講,函數式編程就是關於如使用通用的可複用函數進行組合編程。」——做者在重構 TypeScript 代碼時使用函數式的一些思考
React.js 的代碼中包含了大量函數式思想,好比 Immutable,好比 Redux 的柯里化函數以及代碼組合,不妨來看看。
若是你打算開始函數式編程,晦澀的 Monad/Functor 們可能也須要動手寫點東西來熟悉,而隨着整個 React 社區往函數式方向發展,Elm 做爲前端函數式編程的先驅和風向標,毫無疑問是值得去學習和借鑑的。這兩個系列,一步步地帶你瞭解如何使用 Elm 構建應用。
5. 函數式的思想在其餘語言中的體現
函數式編程在實際生產中發揮着巨大的做用,愈來愈多的語言加入閉包,匿名函數等很是典型的函數式編程的特性,從某種程度上來說,函數式編程正在逐步「同化」命令式編程。
Swift - Swift 中的柯里化 Currying:Swift 柯里化特性的簡單瞭解
Scala - Scala 類型參數:多範式語言的典範
Java - Java8 Lambda 本質論 丨 正交設計 丨 Write Lean Programs:Java 的設計模式、λ 演算、設計思想
Scheme - 如何實現一個沒有名字的遞歸函數:一個遞歸引起的思考 - 「當函數在尚未定義完整時,爲何可以直接調用的呢?」
6. 補充閱讀
(本期完)
# SegmentFault 技術週刊 #
「技術週刊」是社區特別推出的技術內容系列,一週一主題。週刊篩選的每篇內容,是做者的獨到看法,踩坑總結和經驗分享。