翻譯連載 |《你不知道的JS》姊妹篇 | JavaScript 輕量級函數語言程式設計-引言&前言

iKcamp發表於2017-08-21

譯者團隊(排名不分先後):阿希bluekenbrucechamcfanlifedailkyoko-dfl3velilinsLittlePineappleMatildaJin冬青pobusamaCherry蘿蔔vavd317vivaxy萌萌zhouyao

關於譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的樑柱;分享,是 CSS 裡最閃耀的一瞥;總結,是 JavaScript 中最嚴謹的邏輯。經過捶打磨練,成就了本書的中文版。本書包含了函數語言程式設計之精髓,希望可以幫助大家在學習函數語言程式設計的道路上走的更順暢。比心。

本書主要探索函數語言程式設計[1](FP)的核心思想。在此過程中,作者不會執著於使用大量複雜的概念來進行詮釋,這也是本書的特別之處。我們在 JavaScript 中應用的僅僅是一套基本的函數語言程式設計概念的子集。我稱之為“輕量級函數語言程式設計(FLP)”。

註釋: 題目中使用了“輕量”二字,然而這並不是一本“輕鬆的”“入門級”書籍。本書是嚴謹的,充斥著各種複雜的細節,適合擁有紮實 JS 知識基礎的閱讀者進行研讀。“輕量”意味著範圍縮小。通常來說,關於函數語言程式設計的 JavaScript 書籍都熱衷於擴充閱讀者的知識面,並企圖覆蓋更多的知識點。而本書則對於每一個話題都進行了深入的探究,儘管這種探究是小範圍進行的。

讓我們面對這個事實:除非你已經是函數語言程式設計高手中的一員(至少我不是!),否則類似“一個單子僅僅是自函子中的么半群”這類說法對我們來說毫無意義。

這並不是說,各種複雜繁瑣的概念是無意義的,更不是說,函數語言程式設計者濫用了它們。一旦你完全掌握了輕量的函數語言程式設計內容,你將會/但願會想要對函數語言程式設計的各種概念進行更正式更系統的學習,並且你一定會對它們的意義和原因有更深入的理解。

但是我更想要讓你能夠現在就把一些函數語言程式設計的基礎運用到 JavaScript 程式設計過程中去,因為我相信這會幫助你寫出更優秀的,更符合邏輯的程式碼。

更多關於本書背後的動機和各種觀點討論,請參看[前言]。

JavaScript 輕量級函數語言程式設計

目錄

  • 序言
  • 前言
  • 第 1 章:為什麼使用函數語言程式設計?
    • 置信度
    • 交流渠道
    • 接受
    • 你不需要它
    • 資源
  • 第 2 章:函式基礎
    • 什麼是函式?
    • 函式輸入
    • 函式輸出
    • 函式功能
    • 句法
    • 來說說 This ?
  • 第 3 章:管理函式的輸入(Inputs)
    • 立即傳參和稍後傳參
    • 一次傳一個
    • 只要一個實參
    • 擴充套件在引數中的妙用
    • 引數順序的那些事兒
    • 無形參風格
  • 第 4 章:組合函式
    • 輸出到輸入
    • 重排序組合
    • 抽象
    • 回顧形參
  • 第 5 章:減少副作用
    • 什麼是副作用
    • 一次就好
    • 純粹的快樂
    • 有或者無
    • 純化
  • 第 6 章:值的不可變性
    • 原始值的不可變性
    • 從值到值
    • 重新賦值
    • 效能
    • 以不可變的眼光看待資料
  • 第 7 章: 閉包 vs 物件
    • 達成共識
    • 相像
    • 同根異枝
  • 第 8 章:列表操作
    • 非函數語言程式設計列表處理
    • 對映
    • 過濾器
    • Reduce
    • 高階列表操作
    • 方法 vs 獨立
    • 查尋列表
    • 融合
    • 列表之外
  • 第 9 章:遞迴
    • 定義
    • 宣告式遞迴
    • 棧、堆
    • 重構遞迴
  • 第 10 章:非同步的函式式
    • 時間狀態
    • 積極的 vs 惰性的
    • 響應式函數語言程式設計
  • 第 11 章:融會貫通
    • 準備
    • 股票資訊
    • 股票行情介面
  • 附錄 A: Transducing
  • 附錄 B: 謙虛的 Monad
  • 附錄 C: 函數語言程式設計函式庫

關於出版

本書主要在 on Leanpub 平臺上以電子版本的形式進行出版。我也嘗試出售本書的紙質版本,但沒有確定的方案。

除了購買本書以外,如果你想要對本書作一些物質上的捐贈,請在 patreon 上進行操作。本書作者感謝你的慷慨解囊。

Patreon
Patreon

Patreon

真人教學課程

本書內容大多源自於我教授的一個同名課程(以公司舉辦的公開或內部研討會這樣的形式進行)。
如果你喜歡本書的內容,並希望組織此類課程,或者組織關於其他 JS/HTML5/Node.js 課程,請通過以下方式聯絡我:
getify.me

線上視訊課程

我還提供一些可以線上點播的 JS 培訓課程。我在 Frontend Masters 上開辦課程,例如我的 Functional-Lite JS 研討會。還有一些課程釋出在 PluralSight 上。

Contributions

關於內容貢獻

非常歡迎對於本書的任何內容貢獻。但是在提交 PR 之前請務必認真閱讀 Contributions Guidelines

版權

本書所有的材料和內容都歸屬 (c) 2016-2017 Kyle Simpson 所有。

Creative Commons License
本書根據Creative Commons Attribution-NonCommercial-NoDerivs 4.0 Unported License 進行授權許可.

  1. FP,本書統稱為函數語言程式設計。

眾所周知,我是一個函數語言程式設計迷。我嘗試閱讀最新的學術論文,業餘時間乃至工作間隙研究抽象代數(譯者注:抽象代數又稱近世代數,是研究各種抽象公理化代數系統的數學學科,也是現代計算機理論基礎之一),並四處傳播函數語言程式設計的理念和語言。我所書寫的 JavaScript 程式碼,每一條語句都是純的。沒錯,我就是一個徹頭徹尾的函數語言程式設計教條式的狂熱者。關於為什麼要寫純的語句,請看我寫的這本書

其實我以前並不是這樣子... 我曾痴迷於物件導向,並熱衷於使用物件導向的方法來構建“真實世界”。我是人造機器人的發明者,夜以繼日地修正機器人以達到更高精度的控制力。我也是有意識木偶的創造者,手指在鍵盤上的輕舞飛揚賦予了它們生命。做為黑客界的蓋位元(譯者注:蓋位元是玩具之父),在連續不間斷的寫了 5 年物件導向的程式碼後,我對於這些成果還是不甚滿意。整個過程也並不順利,我一直感覺自己是一個糟糕的程式設計師,甚至失去了信心,認為寫出既簡單,又靈活同時又很好擴充套件的程式碼是不可能的。

我想是時候去嘗試一些新的方法了,我開始涉足函數語言程式設計的理念,並把它用在我的程式碼中。我的同事對此非常驚詫,他們根本不知道我在幹什麼。那段時間裡我寫的程式碼非常糟糕、另人生厭、簡直是垃圾。造成這樣結果的原因是我缺少一個目標或者說願景。當然現在那個會編碼的蟋蟀傑明尼(譯者注:原文使用 Jiminy-Coding-Cricket 迪士尼動畫人物蟋蟀傑明尼來暗指之前蹩腳的自己)已經不在了。在花費了好長時間,寫了好多垃圾程式後我才弄明白怎樣正確進行函數語言程式設計。

現在,經歷了那些亂七八糟的探索後,我感覺到純函式程式設計實現了它所承諾的程式碼可讀性和可複用。我不再發明而是發現我的模型,我像一個正在揭開巨大陰謀的偵探,在軟木板上釘滿了數學證據。一個數字時代的庫斯托(譯者注:庫斯托是個傳奇式的人物,探險家、電影製片人,一個享有戴高樂將軍一樣世界性聲譽的法國人,作者比喻自己學習函數語言程式設計就像庫斯托探索海洋一般)以科學的名義記錄下了這片奇特土地的特徵!雖然並不完美,仍有很多東西要學習,但我對我的工作和產出從未有過現在這般滿意!

假如一開始就有這本書,我探索純函數語言程式設計世界的道路就會更平坦一點,而不是荊棘滿地。本書有兩層:第一層教會你如何在每天的編碼工作中,有效地使用各種各樣的函式式構造方法。另一層則更重要,本書會提供一個準星,確保你不會偏離函數語言程式設計的原則。

函數語言程式設計是一種程式設計正規化,Kyle 倡導使用它來實現宣告式程式設計和函數語言程式設計,同時該正規化還可以與 JavaScript 世界形成平衡和互動。通過學習本書,你無需徹底理解正規化的一切,就能瞭解純函數語言程式設計的基礎;你無需重新創造輪子,就能獲得練習和探索函數語言程式設計的技能,並讓程式碼執行良好;你無需像我之前一樣漫無目的地徘徊、甚至走回頭路就能讓你的職業生涯更上一層樓。你的合作者和同事們一定會欣喜若狂!

Kyle (譯者注:Kyle 是火爆全球的《你不知道的 JavaScript》一書原作者)是一位偉大的老師,他對函數語言程式設計的巨集偉藍圖不懈追求,不放過任何一個角落和縫隙,同時他也苦學習者之苦。他的風格與行業產生共鳴,將大家的水平整體提高了一個檔次。他的工作成果不僅出現在很多人的收藏夾中,也在 JavaScript 發展歷史上佔據堅實地位。Kyle 老師是絕世高手,你值得擁有。

函數語言程式設計有很多種定義。Lisp 程式設計師和 Haskell 程式設計師對於函數語言程式設計的定義截然不同。OCaml 和 Erlang 語言對於函數語言程式設計正規化的看法也大相徑庭。即使在同一種語言 JavaScript 中,你也能看到函數語言程式設計不同的定義。但總有一種紐帶把這些不同的函數語言程式設計連線在一起,這個紐帶是一個有些模糊的“我一看就知道”的定義,這聽起來有點下流(有人確實覺得函數語言程式設計下流)。本書旨在抓住這個紐帶,並不讓你學習某些圈子的固定習語,而是讓你獲取相關知識,這些知識不論在哪個語言的函數語言程式設計中都適用。

本書是你開啟函數語言程式設計旅途的絕佳起點。開始吧,Kyle 老師...

-Brian Lonsdorf (@drboolean)

前言

單子是自函子範疇上的一個么半群

有暈頭轉向嗎?不要擔心,我自己也被繞暈了!對於那些已經瞭解函數語言程式設計的人來說,這些專業術語才有意義,然而對於大部分人而言,它們沒有任何意義。

這本書並不打算教你以上那些專業術語的具體含義。如果那正是你想查詢的,請繼續查閱。事實上,已經有很多從頭到尾(正確的方式)介紹函數語言程式設計的書了。如果你在深入學習函數語言程式設計,這些專業術語有很重要的意義,你肯定會對這些專業術語越來越熟悉。

但是本書打算以另一種方式講解函數語言程式設計。我將從函數語言程式設計的一些基礎概念講起,並儘可能少用晦澀難懂的專業術語。我們將嘗試以更實用的方法來探討函數語言程式設計,而非純粹的學術角度。毫無疑問,肯定會有專業術語。但是我將會小心謹慎的引入這些術語並解釋為何它們如此重要。

可悲的是我並非酷酷的函數語言程式設計俱樂部的一員。我從沒有正式學過函數語言程式設計。儘管我有計算機方面的教育背景並對數學有一定了解,但數學符號跟我理解的程式設計完全是兩回事。我從來沒寫過一行 Scheme、Clojure 或 Haskell 程式碼,也不是老派的 Lisp 程式設計師。

我曾參加過不計其數的討論函數語言程式設計的會議,每次都希望能徹底搞明白函數語言程式設計中那些神祕的概念到底是什麼意思。然而每次我都失望而歸,那些概念在我腦海裡亂成一團,我甚至不清楚自己學了些什麼。也許我學到了些東西吧,但是很長時間以來我都不能確定自己學到了什麼。

通過不斷的程式設計實踐,而非站在學術的角度,我慢慢的理解了那些對函數語言程式設計者[1]
來說很簡單直白的重要概念。你是否也有類似的經歷 —— 你早就知道一件事,但直到很久之後你突然發現它竟然還有一個你從來不知道的名字!?

也許你像我一樣;好幾年前就聽說過像“map-reduce”,“big data”等這些術語,但並不懂它們的實際意義。最終我明白了map(..)函式到底做了哪些事情 —— 在我知道列表操作是通向函數語言程式設計者之路的基石,並且為何它們如此重要之後。我知道對映很久了,甚至在我知道它叫map(..)之前。

最終我開始整理這些想法並將它們稱之為「輕量級函數語言程式設計」(FLP)。

使命

但是,為什麼學習函數語言程式設計如此重要,即便只是學習輕量級函數語言程式設計?

最近幾年我越來越深刻的理解到程式設計的核心是人,而不是程式碼,我甚至將其視為一種信仰。我堅信程式碼只是人類交流的手段,只是它產生的副作用(彷彿聽到了自我引用的笑聲)才對電腦發出具體指令。

在我看來,函數語言程式設計的核心在於讓你在程式設計時使用一些廣為人知、易於理解的模式。經過驗證,這些模式可以有效隔離讓程式碼難以理解的錯誤。所以,函數語言程式設計 —— 咳,輕量級函數語言程式設計 —— 是每個開發者都可以掌握的重要工具之一。

monad的含義是,一旦你搞懂了,你就無法跟別人解釋什麼是monad了。

Douglas Crockford 2012 "Monads and Gonads"

www.youtube.com/watch?v=dkZ…

我希望這本書有可能打破上面的詛咒,儘管我們要到最後的附錄部分才開始討論「monad」。

科班出身的函數語言程式設計者經常宣稱只有 100% 使用函數語言程式設計才算是真正地使用函數語言程式設計:這是一種要麼全有要麼全無的主張。它會讓人覺得如果程式設計時只有一部分使用了函數語言程式設計而另一部分沒用到,整個程式會被那些沒有使用函數語言程式設計的部分汙染,從而認為使用函數語言程式設計並不值得。

我想明確地說:我認為絕對主義並不存在。這沒有意義,就像愚蠢地建議我只有使用完美的語法,這本書才算完美,如果犯了一點點錯誤,就會讓整本書質量變低一樣。

我寫地越清楚,前後越一致,你閱讀此書的體驗將越好。但我不是一個完美無缺的作者。有些章節可能比另外一些寫的好。但是那些有待提高的章節不會使書中寫的好的部分黯然失色。

同樣的道理也適用於程式碼。隨著你越來越多的使用函數語言程式設計的模式,你的程式碼質量會越來越高。25% 的時間使用它們,你會得到一些好處。80% 的時間使用它們,你將收益更多。

除了幾處僅存的特例,你不會在本書裡看到很多絕對的論斷。我們討論的是要追求的目標和現實中方方面面的權衡。

歡迎來到最實用的函數語言程式設計的學習之旅。我們將共同探討學習!

  1. FPer,本書統稱為函數語言程式設計者。

【下一章】翻譯連載 |《JavaScript 輕量級函數語言程式設計》- 第 1 章:為什麼使用函數語言程式設計?

iKcamp原創新書《移動Web前端高效開發實戰》已在亞馬遜、京東、噹噹開售。

相關文章