不再推薦haskell_haskell趣學(xué)指南知乎_Haskell編程語(yǔ)言的入門(mén)趣學(xué)指南
本文關(guān)鍵詞:Haskell趣學(xué)指南,由筆耕文化傳播整理發(fā)布。
歡迎來(lái)到Haskell趣學(xué)指南!閱讀此文表明你正要學(xué)haskell。很好,來(lái)對(duì)地方了,先容我簡(jiǎn)單介紹一下這個(gè)教程。
編 寫(xiě)這個(gè)教程,一方面是為了鞏固我自己對(duì)haskell的理解,另一方面也是希望能夠分享我的經(jīng)驗(yàn),給初學(xué)者提供一定幫助。網(wǎng)上現(xiàn)有的haskell教程已 經(jīng)汗牛充棟,在我學(xué)習(xí)的時(shí)候就曾參閱過(guò)許多教程與文章,它們講解問(wèn)題的思路各不相同,綜合的閱讀使得我最終能夠整理起知識(shí)的碎片并正確地理解。所以說(shuō),編 寫(xiě)這個(gè)教程也是創(chuàng)造另一個(gè)學(xué)習(xí)資源的嘗試,給讀者增加一個(gè)選擇的余地。
本教程主要是面向已經(jīng)有命令式編程經(jīng)驗(yàn)(C, C++, Java, Python …) 、卻未曾接觸過(guò)函數(shù)式編程 (Haskell, ML, OCaml …)的讀者。還沒(méi)有編程基礎(chǔ)?沒(méi)關(guān)系,像你這樣的聰明小伙一定能夠?qū)W會(huì)haskell!
若在學(xué)習(xí)中遇到什么地方不明白,freenode上的#haskell頻道是提問(wèn)的絕佳去處。那兒的人們友善,耐心且照顧新人。
在 我掌握haskell之前的學(xué)習(xí)曾經(jīng)失敗過(guò)兩次,它看起來(lái)太不可思議,難以理解。不過(guò)隨后突然靈光一閃,馬上就開(kāi)竅了,往后的學(xué)習(xí)也就變得游刃有余。我想 說(shuō)的就是:haskell很棒,如果你喜歡編程,那就得好好學(xué)學(xué)--盡管在咋一看它可能會(huì)顯得很別扭--它迫使你換個(gè)腦筋思考,很有趣!
好,下一節(jié)。。。
那么,haskell是啥?haskell是一門(mén)純函數(shù)式編程語(yǔ)言。 在命令式語(yǔ)言中執(zhí)行操作需要給電腦安排一組命令,隨著命令的執(zhí)行,狀態(tài)就會(huì)隨之發(fā)生改變。例如你給變量a賦值為5,而隨后做了其它一些事情之后a就可能變 成的其它值。有控制流程,你就可以重復(fù)執(zhí)行操作。然而在函數(shù)式編程語(yǔ)言中,你不是像命令式語(yǔ)言那樣命令電腦“要做什么”,而是通過(guò)用函數(shù)來(lái)描述出問(wèn)題“是 什么”,如“階乘是指從1到某數(shù)間所有數(shù)字的乘積”。變量一旦賦值,就不可以更改了,你已經(jīng)說(shuō)了a就是5,就不能再另說(shuō)a是別的什么數(shù)。做 人不能食言,對(duì)不?所以說(shuō),函數(shù)式編程語(yǔ)言中的函數(shù)能做的唯一事情就是求值,因而沒(méi)有副作用。一開(kāi)始會(huì)覺(jué)得這很受限,不過(guò)好處也正源于此:若以同樣的參數(shù) 調(diào)用同一函數(shù)兩次,得到的結(jié)果總是相同。這被稱作“引用透明”。如此一來(lái)編譯器就可以理解程序的行為,你也很容易就能驗(yàn)證一個(gè)函數(shù)的正確性,繼而可以將一些簡(jiǎn)單的函數(shù)組合成更復(fù)雜的函數(shù)。
haskell是惰性的。也就是說(shuō)若非特殊指明,函數(shù)在真正需要結(jié)果以前不會(huì)被求值。再加上引用透明,你就可以把程序僅看作是數(shù)據(jù)的一系列變形。如此一來(lái)就有了很多有趣的特性,如無(wú)限長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)。假設(shè)你有一個(gè)List:xs = [1,2,3,4,5,6,7,8],還有一個(gè)函數(shù)doubleMe,它可以將一個(gè)List中的所有元素都乘以二,返回一個(gè)新的List。若是在命令式語(yǔ)言中,把一個(gè)List乘以8,執(zhí)行doubleMe(doubleMe(doubleMe(xs))), 得遍歷三遍xs才會(huì)得到結(jié)果。而在惰性語(yǔ)言中,調(diào)用doubleMe時(shí)并不會(huì)立即求值,它會(huì)說(shuō)“嗯嗯,待會(huì)兒再做!”。不過(guò)一旦要看結(jié)果,第一個(gè) doubleMe就會(huì)對(duì)第二個(gè)說(shuō)“給我結(jié)果,快!”第二個(gè)doubleMe就會(huì)把同樣的話傳給第三個(gè)doubleMe,第三個(gè)doubleMe只能將1乘 以2得2后交給第二個(gè),第二個(gè)再乘以2得4交給第一個(gè),最終得到第一個(gè)元素8。也就是說(shuō),這一切只需要遍歷一次list即可,而且僅在你真正需要結(jié)果時(shí)才 會(huì)執(zhí)行。惰性語(yǔ)言中的計(jì)算只是一組初始數(shù)據(jù)和變換公式。
haskell 是靜態(tài)類(lèi)型的。 當(dāng)你編譯程序時(shí),編譯器需要明確哪個(gè)是數(shù)字,哪個(gè)是字符串。這就意味著很大一部分錯(cuò)誤都可以在編譯時(shí)被發(fā)現(xiàn),若試圖將一個(gè)數(shù)字和字符串相加,編譯器就會(huì)報(bào) 錯(cuò)。haskell擁有一套強(qiáng)大的類(lèi)型系統(tǒng),支持自動(dòng)類(lèi)型推導(dǎo)。這一來(lái)你就不需要在每段代碼上都標(biāo)明它的類(lèi)型,像計(jì)算a=5+4,你就不需另告訴編譯器 “a是一個(gè)數(shù)值”,它可以自己推導(dǎo)出來(lái)。類(lèi)型推導(dǎo)可以讓你的程序更加簡(jiǎn)練。假設(shè)有個(gè)二元函數(shù)是將兩個(gè)數(shù)值相加,你就無(wú)需聲明其類(lèi)型,這個(gè)函數(shù)可以對(duì)一切可 以相加的值進(jìn)行計(jì)算。
haskell采納了很多高級(jí)概念,因而它的代碼優(yōu)雅且簡(jiǎn)練。與同層次的命令式語(yǔ)言相比,haskell的代碼往往會(huì)更短,更短就意味著更容易理解,bug也就更少。
haskell的研發(fā)工作始于1987年,當(dāng)時(shí)是一個(gè)學(xué)會(huì)的精英分子(很多PhD哦)聚到一塊兒,商量著要設(shè)計(jì)一門(mén)牛X的語(yǔ)言。03年,《 Haskell Report 》發(fā)布,,標(biāo)志著穩(wěn)定版本的最終確定。
你需要...一 個(gè)編輯器和一個(gè)編譯器。你可能已經(jīng)安裝了最喜歡的編輯器,在此不加贅述。如今最常用的haskell編譯器是GHC和hugs,在本教程中我們將使用 ghc。安裝的細(xì)節(jié)就不消多說(shuō)了,在windows下只要下載一個(gè)installer然后一路next最后重啟一下(貌似不需要重啟,譯者注)即可;在基 于debain的linux系統(tǒng)下一個(gè)apt-get install ghc6 libghc6-mtl-dev看著玩就是了;我沒(méi)mac電腦,不過(guò)聽(tīng)說(shuō)你如果安裝了macPort,就可以通過(guò)sudo port install ghc來(lái)獲得ghc。嗯,應(yīng)該可以用那古怪的單鍵鼠標(biāo)搞haskell吧,我拿不準(zhǔn)。
GHC 既可以解釋執(zhí)行haskell腳本(通常是以.hs作為后綴),也可以編譯。它還有個(gè)交互模式,你可以在里面調(diào)用腳本里定義的函數(shù),即時(shí)得到結(jié)果。 對(duì)于學(xué)習(xí)而言,這可比每次修改都編譯執(zhí)行要方便的多。想進(jìn)入交互模式,只要打開(kāi)控制臺(tái)輸入ghci即可。假設(shè)你在myfunctions.hs里定義了一 些函數(shù),在ghci中輸入:l myfunctions.hs}載后就可以調(diào)用了。一旦修改了這個(gè).hs文件的內(nèi)容,再次執(zhí)行:l myfunctions.hs或者與之等價(jià)的:r,都可以重新裝載該文件。我本人通常就是在.hs文件中定義幾個(gè)函數(shù),再到ghci裝載,調(diào)試,再修改再裝載。這也正是我們往后的基本流程。
其它內(nèi)容:本文關(guān)鍵詞:Haskell趣學(xué)指南,由筆耕文化傳播整理發(fā)布。
本文編號(hào):93574
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/93574.html