天天看點

準備充分了嘛就想學函數式程式設計?(Part 6)

<b>本文講的是準備充分了嘛就想學函數式程式設計?(Part 6),</b>

<b></b>

第一步,了解函數式程式設計概念是最重要的一步,同時也是最難的一步。如果你從正确的角度或方法來了解的話,它也未必會有那麼難。

準備充分了嘛就想學函數式程式設計?(Part 6)

現在你已經學會了所有這些新東西了,你可能在想,“現在該幹什麼?我如何在日常程式設計中使用它?”

這得看情況。如果你會使用純函數式語言(如 Elm 或 Haskell)程式設計,那麼你可以嘗試所有這些想法。這些語言能夠很容易實作這些想法。

如果你隻會使用 Javascript 這樣的指令式語言程式設計(我們中大多數人肯定都是),那麼你仍然可以使用很多你學到的知識,但是還需要更多的訓練。

準備充分了嘛就想學函數式程式設計?(Part 6)

Javascript 有許多特性能讓你以近乎函數式的方式程式設計。它不是純粹的函數式,但你可以從語言中得到不變性,甚至更多的庫。

它不是最佳的,但如果你必須使用的時候,那為什麼不利用一些函數式語言的優點呢?

不變性

首先要考慮的是不變性。 在 ES2015,或者也叫 ES6,因為它有一個被稱為 常量 的新關鍵字。這意味着一旦設定了變量,則無法修改該變量:

這裡的 a 被定義為常量,意味着一旦指派無法再改變。 這就是為什麼 a = 2 會抛出異常 (除了 Safari)。

Javascript 常量 有個問題就是不變性不夠深入。以下示例說明了其限制:

注意 a.x = 2 并沒有抛出異常。 const 關鍵字的不變性隻對變量 a 生效。 a 所指向的任何變量都可以改變。

這是非常令人失望的,因為它本可以讓 Javascript 更好。

那麼我們如何從 Javascript 中獲得不變性呢?

柯裡化群組合

在本系列之前的文章,我們學習了如何編寫柯裡化的功能。這是一個更複雜的例子:

請注意,我們不得不手工編寫柯裡化部分。

調用 f, 我們必須寫成:

但是這麼多的括号,足以讓 Lisp 程式員哭泣了!(譯者注:Lisp 語句中會使用很多括号)

使用 Ramda 我們可以這樣寫:

函數定義并沒有什麼改進,但我們已經消除了對所有括号的需求。請注意,我們可以應用與我們每次調用 f 時一樣多的參數。

事實證明,Ramda 有很多幫助函數來做這些事情,例如。R.add 和 R.multiply,這意味着我們可以少寫代碼:

Map, Filter 和 Reduce

Ramda 也有它自己的 map, filter 和 reduce。 盡管這些功能在普通 Javascript Array.prototype 中已經存在, Ramda 的版本功能更加豐富:

R.modulo 用了兩個參數. 第一個是 dividend (被除數) ,第二個參數是 divisor (除數)。

isOdd 函數隻是除以 2 的餘數。餘數為 0 是 falsy, 不是奇數,餘數為 1 則是 truthy,奇數。 我們翻轉 modulo 的第一和第二參數,使得我們可以指定 2 作為除數。

isEven 功能隻是 isOdd 的 complement(補集)。

onlyOdd 函數是通過 isOdd 來 斷言(隻傳回布爾類型的方法) 的 過濾器 。它在等待 numbers 數組,即它在執行前需要的的最後一個參數。

The onlyEven 是一個使用 isEven 來斷言的 過濾器 。

當我們将 numbers 傳給 onlyEven 、onlyOdd 、isEven 和 isOdd 方法,擷取它們最終的參數,最後執行然後傳回我們期望的結果。

準備充分了嘛就想學函數式程式設計?(Part 6)

Javascript 已經有很多的庫,語言也得到增強,它仍然需要面對殘酷的現實,它是一種指令式語言,對大家來說似乎能夠做任何事情。

大多數前端人員在浏覽器中一直使用着 Javascript ,因為一直以來隻有這一種選擇。但現在許多開發人員逐漸不再直接編寫 Javascript。

取而代之,他們用不同的語言編寫和編譯,或者更準确的說,是用其他語言轉換成 Javascript。

CoffeeScript 就是這些語言中的第一種。如今,Angular 2 中采用了 Typescript。Babel 也是一種 Javascript 轉換編譯器。

越來越多的人正在采用這種方法用于生産環境。

但是這些語言還是基于 Javascript ,而且隻是稍微改進了一點點。為什麼不從一個純函數式語言轉換到 Javascript?

準備充分了嘛就想學函數式程式設計?(Part 6)

在這個系列裡,我們了解了 Elm 來幫助了解函數式程式設計。

但是什麼才是 Elm?我又該怎麼用它呢?

Elm 程式沒有任何運作時錯誤。

我需要用 Elm 替換我所有的 Javascript 嗎?

為什麼學習 Elm?

函數式程式設計是限制和自由并存的。它限制了你可以做什麼(大部分是保證你不會“誤傷”自己),但是同時也讓你遠離 bug 和錯誤的設計決策,因為所有的 Elm 程式遵循 Elm Architecture,一個函數式響應程式設計模型。

函數式程式設計能讓你成為一個更好的程式員。本文中的想法隻是冰山一角。 你真的需要在實踐中看到,它們是如何讓你的程式縮小尺寸,增加穩定性。

準備充分了嘛就想學函數式程式設計?(Part 6)

不可能知道将來會怎樣,但我們可以做一些猜測。下面是一些我的:

将會出現一個明确的語言,編譯為 Javascript。
已經存在了 40 多年的函數式程式設計思想将被重新發現,以解決目前的軟體複雜性問題。
硬體的狀态,例如千兆位元組的便宜記憶體和快速處理器,将使函數式技術成為可行。
CPU 不會變得更快,但核心的數量将繼續增加。
可變狀态将成為複雜系統中的最大問題之一。

我寫這系列文章,因為我相信未來是函數式程式設計的未來,在過去的幾年中,我在努力學習它(我還在學習)。

我的目标就是幫助别人比我更容易和更快的去學習這些概念,幫助别人成為更好的程式員,以便他們将來能有更好的就業前景。

即使我的預測,Elm 在未來将是一門偉大的語言是錯誤的,我可以肯定地說,函數式程式設計和 Elm 也會在未來的畫卷上留下濃墨重彩的一筆。

我希望在閱讀完本系列以後,你會對你的能力和這些概念的了解感到更加自信。

在今後的工作中,祝你好運。

<b>原文釋出時間為:2016年11月17日</b>

<b>本文來自雲栖社群合作夥伴掘金,了解相關資訊可以關注掘金網站。</b>

繼續閱讀