聽說你想成為一名函數語言程式設計工程師(第一部分)
邁出理解函數語言程式設計思想的第一步是最重要的,同時也許是最難的。關於這一點,仁者見仁智者見智。
學車
當我們第一次碰車,我們痛苦並努力著,看起來很簡單的操作自己上手的時候就變得比自己想象的難得多。儘管用父母的車經過多次練習,不把周圍的路跑熟是不敢上高速路冒險的。但是經過不斷練習和一些父母寧願忘記的“心跳時刻”後,我們最終還是拿到了自己的駕照。
有了我們的駕照, 只要有可能, 我們就會把車開出來。每次旅行, 我們都變得越來越好, 信心也增強了。後來有一天, 我們不得不開別人的車, 否則我們的車終於放棄了幽靈, 我們不得不買了一輛新的。
第一次在不同的車底開車是什麼感覺?這就像第一次開車一樣嗎?連近在咫尺都沒有。第一次, 都是那麼的陌生。在那之前我們一直在車裡, 但只是作為乘客。這次我們坐在駕駛座上。包含所有控制元件的那個。
但當我們駕駛第二輛車的時候, 我們只是問自己幾個簡單的問題, 比如, 鑰匙去哪裡了, 燈在哪裡, 你怎麼用轉向燈, 怎麼調整側鏡.
在那之後,航行非常順利。 但與第一次相比,為什麼這次這麼容易?
那是因為這輛新車非常像舊車。 它擁有汽車所需的所有基本功能,而且它們幾乎都在同一個地方。
有些東西的實現方式不同,可能還有一些額外的功能,但我們第一次開車甚至第二次都沒有使用它們。 最終,我們學到了所有的新功能。 至少我們關心的是那些。
學習程式語言和學車類似。第一次是非常困難的,但一旦你掌握了一門語言,後面學習其他的程式語言就會變得很容易。
當你第一次開始學習第二種語言時,你會問這樣的問題:“我怎麼建立模組?你怎麼查詢陣列?什麼是子字串函式的引數?”
你有信心可以學習駕馭這種新語言,因為它會讓你想起你的舊語言,或許還有一些新的東西可以讓你的生活更輕鬆。
你的第一個宇宙飛船
無論你一生中開過一輛車還是幾十輛車,想象一下你即將駕駛一艘宇宙飛船。
如果你要駕駛宇宙飛船,你不會指望你的駕駛能力對你有多大幫助。
你在開始訓練的時候,會期望在太空中有非常不同的東西,而且飛行這個裝置和在地面上駕駛是非常不同的。
物理上沒有改變,只是你在同一個宇宙中導航的方式變了。
學習函數語言程式設計亦是如此。你會預想所有的事情都會變得非常不同,並且你所知道的程式設計知識也不會相互轉換。
程式設計就是思考的過程,而函數語言程式設計將教你以不同的方式思考。甚至,你可能永遠不會回到原先的思維方式。
忘掉你所知道的一切
人們喜歡說這句話,還是有點道理的。 學習函數語言程式設計就像是從頭開始。 雖不盡然,但確實有效。函數語言程式設計中有很多與其他範疇相似的概念,但如果你打算必須 重新學習所有東西 ,這是最好的選擇。
從正確的角度看,便會得到正確的預期;有了正確的預期,即使事情艱難之時也不會放棄。
作為程式設計師,你曾經做過的各種各樣的事情,而現在使用函數語言程式設計你什麼也做不了。
就像,在汽車裡,你習慣於倒車來離開車道。但是在宇宙飛船裡,沒有後退操作。現在你可能會想: “什麼?沒有後退?我怎麼能在沒有後退的情況下駕駛啊?!”
然而,事實證明,宇宙飛船能夠在三維空間中操縱,因此你並不需要倒車操作。一旦你理解這一點,便不會再想念“倒車”了。事實上,在某天你會反過來想汽車的限制程度。
學習函數語言程式設計需要一定的時間,請耐心點。
那麼就讓我們退出指令式程式設計的冷酷世界,輕輕地進入函式程式設計的溫泉。
在這篇由多個部分組成的文章中,我們將介紹一些函數語言程式設計概念,這些概念將在您學習第一種函式式語言之前對您有所幫助。或者,如果你已經嘗試過了,這將有助於完善你的理解。
請不要著急。從這一點開始,花點時間閱讀並理解程式碼示例。你甚至可以在每節課結束後停止閱讀,讓你的想法深入理解。然後再回來完成
最重要的是你要理解。
Purity
當函式式程式設計師談到Purity時,他們指的是純函式(Pure Functions)。
純函式是非常簡單的函式。它們僅對輸入引數進行操作。
這是Javascript中的一個純函式的示例:
var z = 10; function add(x, y) { return x + y; }
注意 add 函式不會修改 z 變數。它不會從z中讀取資料,也不會向z寫入資料。它僅讀取x和y,其輸入值,並返回二者相加起來的結果。