Haskell
haskell 是一門純函數式編程語言。在命令式語言中執行操作需要給電腦安排一組命令,隨着命令的執行,狀態就會隨之發生改變。例如你給變量 a 賦值爲 5,而隨後做了其它一些事情之後 a 就可能變成的其它值。有控制流程,你就可以重複執行操作。然而在函數式編程語言中,你不是像命令式語言那樣命令電腦“要做什麼”,而是通過用函數來描述出問題“是什麼”,如“階乘是指從1到某數間所有數字的乘積”。變量一旦賦值,就不可以更改了,你已經說了 a 就是 5,就不能再另說 a 是別的什麼數。做人不能食言,對不?所以說,函數式編程語言中的函數能做的唯一事情就是求值,因而沒有副作用。一開始會覺得這很受限,不過好處也正源於此:若以同樣的參數調用同一函數兩次,得到的結果總是相同。這被稱作“引用透明”。如此一來編譯器就可以理解程序的行爲,你也很容易就能驗證一個函數的正確性,繼而可以將一些簡單的函數組合成更復雜的函數。
haskell 是惰性的。也就是說若非特殊指明,函數在真正需要結果以前不會被求值。再加上引用透明,你就可以把程序僅看作是數據的一系列變形。如此一來就有了很多有趣的特性,如無限長度的數據結構。假設你有一個 List:xs = [1,2,3,4,5,6,7,8],還有一個函數doubleMe,它可以將一個List中的所有元素都乘以二,返回一個新的List。若是在命令式語言中,把一個 List 乘以 8,執行doubleMe(doubleMe(doubleMe(xs))),得遍歷三遍 xs 纔會得到結果。而在惰性語言中,調用 doubleMe 時並不會立即求值,它會說“嗯嗯,待會兒再做!”。不過一旦要看結果,第一個 doubleMe 就會對第二個說“給我結果,快!”第二個 doubleMe 就會把同樣的話傳給第三個 doubleMe,第三個doubleMe只能將 1 乘以 2 得 2 後交給第二個,第二個再乘以 2 得 4 交給第一個,最終得到第一個元素 8。也就是說,這一切只需要遍歷一次list即可,而且僅在你真正需要結果時纔會執行。惰性語言中的計算只是一組初始數據和變換公式。
haskell 是靜態類型的。當你編譯程序時,編譯器需要明確哪個是數字,哪個是字符串。這就意味着很大一部分錯誤都可以在編譯時被發現,若試圖將一個數字和字符串相加,編譯器就會報錯。haskell 擁有一套強大的類型系統,支持自動類型推導。這一來你就不需要在每段代碼上都標明它的類型,像計算 a=5+4,你就不需另告訴編譯器“a 是一個數值”,它可以自己推導出來。類型推導可以讓你的程序更加簡練。假設有個二元函數是將兩個數值相加,你就無需聲明其類型,這個函數可以對一切可以相加的值進行計算。
haskell 採納了很多高級概念,因而它的代碼優雅且簡練。與同層次的命令式語言相比,haskell 的代碼往往會更短,更短就意味着更容易理解,bug 也就更少。
haskell 的研發工作始於 1987 年,當時是一個學會的精英分子(很多 PhD 哦)聚到一塊兒,商量着要設計一門牛 X 的語言。03 年,《 Haskell Report 》發佈,標誌着穩定版本的最終確定。
你需要...
一個編輯器和一個編譯器。你可能已經安裝了最喜歡的編輯器,在此不加贅述。如今最常用的 haskell 編譯器是 GHC 和 hugs,在本教程中我們將使用 ghc。安裝的細節就不消多說了,在 windows 下只要下載一個 installer 然後一路next最後重啓一下(貌似不需要重啓,譯者注)即可;在基於 debain 的 linux 系統下一個
apt-get install ghc6 libghc6-mtl-dev
看着玩就是了;我沒 mac 電腦,不過聽說你如果安裝了 macPort,就可以通過
sudo port install ghc
來獲得 ghc。嗯,應該可以用那古怪的單鍵鼠標搞 haskell 吧,我拿不準。
GHC 既可以解釋執行 haskell 腳本(通常是以 .hs 作爲後綴),也可以編譯。它還有個交互模式,你可以在裏面調用腳本里定義的函數,即時得到結果。 對於學習而言,這可比每次修改都編譯執行要方便的多。想進入交互模式,只要打開控制檯輸入 ghci 即可。假設你在 myfunctions.hs 裏定義了一些函數,在 ghci 中輸入:l myfunctions.hs}載後就可以調用了。一旦修改了這個 .hs 文件的內容,再次執行:l myfunctions.hs或者與之等價的 :r,都可以重新裝載該文件。我本人通常就是在 .hs 文件中定義幾個函數,再到 ghci ,調試,再修改再裝載。這也正是我們往後的基本流程。
喜歡我的作品嗎?別忘了給予支持與讚賞,讓我知道在創作的路上有你陪伴,一起延續這份熱忱!