Haskell編程語言的入門趣學指南

jopen 10年前發布 | 145K 次閱讀 Haskell

  1. 簡介

    • 關于這個教程
    • 那么,haskell是啥?
    • 你需要...
    • </ul> </li>

    • 入門

      • 各就各位,預備!
      • 啟蒙:你的第一個函數
      • List入門
      • 德州區間
      • 我是List Comprehension
      • Tuple
      • </ul> </li>

      • 類型和類型類

        • 相信類型
        • 類型變量
        • 類型類101
        • </ul> </li>

        • 函數的語法

          • 模式匹配
          • 注意,門衛!
          • Where?
          • Let it be
          • case表達式
          • </ul> </li>

          • 遞歸

            • 你好,遞歸!
            • 麥克西米不可思議
            • 幾個遞歸函數
            • 排序,要快!
            • 遞歸地思考
            • </ul> </li>

            • 高階函數

              • 柯里函數
              • 是時候了,來點高階函數!
              • map 與 filter
              • lambda
              • 折疊紙鶴
              • 有$的函數調用
              • 函數組合
              • </ul> </li>

              • 模塊

                • 裝載模塊
                • Data.List
                • Data.Char
                • Data.Map
                • Data.Set
                • 構造自己的模塊
                • </ul> </li>

                • 構造我們自己的類型和類型類

                  • 數據類型入門
                  • Record Syntax
                  • 類型參數
                  • 派生實例
                  • 類型別名
                  • </ul> </li> </ol>

                    關于這個教程

                    歡迎來到haskell趣學指南!閱讀此文表明你正要學haskell。很好,來對地方了,先容我簡單介紹一下這個教程。

                    編 寫這個教程,一方面是為了鞏固我自己對haskell的理解,另一方面也是希望能夠分享我的經驗,給初學者提供一定幫助。網上現有的haskell教程已 經汗牛充棟,在我學習的時候就曾參閱過許多教程與文章,它們講解問題的思路各不相同,綜合的閱讀使得我最終能夠整理起知識的碎片并正確地理解。所以說,編 寫這個教程也是創造另一個學習資源的嘗試,給讀者增加一個選擇的余地。

                    Haskell編程語言的入門趣學指南

                    本教程主要是面向已經有命令式編程經驗(C, C++, Java, Python …) 、卻未曾接觸過函數式編程 (Haskell, ML, OCaml …)的讀者。還沒有編程基礎?沒關系,像你這樣的聰明小伙一定能夠學會haskell!

                    若在學習中遇到什么地方不明白,freenode上的#haskell頻道是提問的絕佳去處。那兒的人們友善,耐心且照顧新人。

                    在 我掌握haskell之前的學習曾經失敗過兩次,它看起來太不可思議,難以理解。不過隨后突然靈光一閃,馬上就開竅了,往后的學習也就變得游刃有余。我想 說的就是:haskell很棒,如果你喜歡編程,那就得好好學學--盡管在咋一看它可能會顯得很別扭--它迫使你換個腦筋思考,很有趣!

                    好,下一節。。。

                    那么,haskell是啥?

                    Haskell編程語言的入門趣學指南

                    haskell是一門純函數式編程語言。 在命令式語言中執行操作需要給電腦安排一組命令,隨著命令的執行,狀態就會隨之發生改變。例如你給變量a賦值為5,而隨后做了其它一些事情之后a就可能變 成的其它值。有控制流程,你就可以重復執行操作。然而在函數式編程語言中,你不是像命令式語言那樣命令電腦“要做什么”,而是通過用函數來描述出問題“是 什么”,如“階乘是指從1到某數間所有數字的乘積”。變量一旦賦值,就不可以更改了,你已經說了a就是5,就不能再另說a是別的什么數。做 人不能食言,對不?所以說,函數式編程語言中的函數能做的唯一事情就是求值,因而沒有副作用。一開始會覺得這很受限,不過好處也正源于此:若以同樣的參數 調用同一函數兩次,得到的結果總是相同。這被稱作“引用透明”。如此一來編譯器就可以理解程序的行為,你也很容易就能驗證一個函數的正確性,繼而可以將一些簡單的函數組合成更復雜的函數。

                    Haskell編程語言的入門趣學指南

                    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 是靜態類型的。 當你編譯程序時,編譯器需要明確哪個是數字,哪個是字符串。這就意味著很大一部分錯誤都可以在編譯時被發現,若試圖將一個數字和字符串相加,編譯器就會報 錯。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裝載,調試,再修改再裝載。這也正是我們往后的基本流程。

                    其它內容http://fleurer-lee.com/lyah/chapters.htm

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!