Haskell Tutorial(1)哈囉!世界!
一場探索純函數式的旅程 …當中的習題解答可以在 我的 Gist 上找到 …可以在 Google Play 或 Pubu 購買 Python Tutorial 系列文章的電子書。 函數式程式設計(Functional programming)已經歷經時代的考驗,這年頭做為一個開發者,或多或少都有聽過函數式程式設計這個名詞,不少主流語言中,也已經或逐步出現函數式程式設計的基礎元素,就連 Java 這個保守的語言,在 Java 8 中,除了 Lambda 語法本身具有一級函式(First class function)概念之外,也突然出現了不少函數式概念的 API。 這類主流語言中,不少本身並不是以函數式為主要典範(Paradigm),為了讓函數式元素在其本身中不至於過於突兀,這類元素多多少少都有經過一些調整,這類調整是必要的,這也是函數式程式設計得以逐漸為開發者接受的主因之一,經過調整之後,才使得讓這類元素得以成為開發者使用的選項之一。 然而,也正因為經過調整,在試圖從這類語言中探討函數式概念時,總有種朦朦朧朧看不清楚真貌的感覺,那麼,來學習一門純函數式語言如何?這就成了我想撰寫 Haskell Tutorial 一開始的動機。 實際上,已經有不少 Haskell 的好書,像是《Learn You a Haskell for Great Good!》,線上觀看是免費的,如果想購買電子書或實體書也行,中文翻譯為《Haskell 趣學指南》;其他書籍像是《Real World Haskell》也有線上版、電子書、實體書的選擇。 自己想來寫寫看,無非就是想整理一下這幾年的心得,用自己的順序來構築一個路徑。 安裝 GHC那麼,就不閒話了,來看看如何用 Haskell 寫個「哈囉!世界!」吧!首先,安裝 Haskell 編譯器,這邊是在 Ubuntu Linux 下進行:
這邊使用的是 GHC(Glasgow Haskell Compiler),安裝好之後,實際上也會有個 GHCI,也就是直譯環境可以使用,直接輸入 在這邊基本上可以看到,Haskell 是強型別語言,數值 5 不能與字串 “10″ 直接進行運算。要離開 GHCI,可以輸入 來試著用 哈囉!世界!一般來說,不少文件或書籍在介紹 Haskell 相關元素時,會有不少篇幅是使用 GHCI 來介紹的,因為這樣可以不用一開始接觸那麼多觀念,不過,我還是想先寫個原始碼、編譯、執行介紹,以便在一開始就能稍微瞭解這個流程。 那麼,該是來寫個「哈囉!世界!」的時候了,使用你慣用的編輯器,寫個 hello.hs:
原始碼記得用 UTF-8,這是 Ubuntu Linux 下預設的文字編碼,如果你要使用中文,這是最簡單的方式。Haskell 的程式進入點是 在存檔之後,使用 可以看到,編譯成功之後,會產生兩個檔案,.hi 是介面檔(interface file),包括了 hello 揭露(export)的函式訊息,.o 是目的碼(object code),執行之後,就可以看到「哈囉!世界!」。 互動版「哈囉!世界!」還沒結束,通常我的第一個「哈囉!世界!」不會那麼簡單,至少要有個能與使用者互動的過程,那麼以下是第二個版本的「哈囉!世界!」: 請輸入你的名稱:
寫個能顯示中文、有基本互動的「哈囉!世界!」,會比在那比哪個程式語言的「哈囉!世界!」可以最短來得有意義,通常可以稍微揭露一門語言背後的複雜度。像是在這邊,就看到了幾個之後都還會詳加探討的元素。 先探討幾個簡單的元素,第一是縮排,Haskell 對縮排有嚴格的要求,同一層次的程式碼必須擁有相同縮排,這點與 Python 類似,但稍微寬鬆一些,例如,以下也是可以的:
因為
接下來可以看到 在編譯與執行之後,你會看到以下結果: 嗯?提示輸入名稱可以不換行嗎?可以是可以,可以將 提示文字怎麼會在輸入之後才出來,預設情況下,輸出會被緩衝,直到遇到換行符號,或者是緩衝區滿了才會輸出,你可以直接出清(flush)緩衝區:
更多細節以上的解釋,作為之後範例程式的基礎已經足夠,不過,我還有幾個細節沒解釋,例如 在第一個「哈囉!世界!」中, 至於 至於 IO Monad 的作用,在 Haskell 中是作為無副作用(side effect)的解套工具 … 嗯!越來越遠了 … 喂喂喂!你還在嗎? … XD 一步一步來吧!之後的文章看過之後,你就慢慢會瞭解的! |
Jeff Chen
11/03
讚! 良格 終於寫到本傳了XD
感謝用心寫的好文
btw, 前段文字中 “ :? ” 被莫名其妙地顯示成了表情符
also 如果不想每次都 compile 又不希望每次都開ghci 的嘗試可以用用看 runghc xxx.hs
同時 putStr 跟 putStrLn 造成的差異也可以看到Haskell特色 - 惰性
“因為還不需要evaluate, 所以我就放著不一定要去evaluate“
可以透過那個”錯誤“的顯示順序抓到特性
do notation 可以視為這樣 (在我學習過程中有幫助清晰一些)
do block 裏裝著 list Of Commands
而commands 就是回傳數值為 action 的 functions
do A 等價于 A
B then B
C then C
另外一本推薦好書 “school of expression”
希望有所幫助:)
再次感謝良格格好文!