仙境里的Haskell(之一)

仙境者,not realworld也 ~

並非說haskell語言不realworld,只是說我這個系列只打算講not realworld的部分,其他的留待《魔界里的Haskell》吧 ( ̄Q ̄)╯

函數式編程語言,我先學習的是Haskell,所以後來學習Scala很輕鬆,在生產上使用很愉快。 每次有人問我怎麼學習Scala,我的建議都是:學一點點Haskell。 然而很少有人聽。。。所以再努力一次。 期望達到的目標是學習後用別的語言(比如Scala和Javascript)寫代碼的姿勢能有所提高 ╮( ̄﹏ ̄)╭

haskell的官網最近改版的很酷炫,下載頁面現在提供了三種安裝方式,原來的官方安裝包叫做Haskell Platform,不要裝,裝Stack,你以後在魔界的生活會輕鬆很多。裝好後,在終端上輸入stack ghci進入repl。 最好設置一下別名,以後輸入ghci就進入repl,會方便一些。

Prelude> 1 + 1n2n

驗證一下repl是否正常。後面的學習內容可能一半是在repl里玩的。

repl里除了能執行haskell語句外,還可以執行很多輔助的命令,用 :? 可以看到命令清單。

最常用的命令是:t, :i , 和 :l、:r

:t 是:type的縮寫,顯示變數類型

Prelude> let x = 1nPrelude> :t xnx :: Num a => a n

(順便說一句,在repl里設置變數的值要用let語句,在hs文件里寫代碼時是不需要的)

:i 是:info的縮寫,顯示給定名字的信息,不管這個名字是變數還是類型

Prelude> :i x -- 顯示x變數的信息nx :: Num a => a t-- Defined at <interactive>:6:5n nnPrelude> :i Num -- 顯示Num類型類的信息nclass Num a wheren (+) :: a -> a -> an (-) :: a -> a -> an (*) :: a -> a -> an negate :: a -> an abs :: a -> an signum :: a -> an fromInteger :: Integer -> an t-- Defined in 『GHC.Num』ninstance Num Word -- Defined in 『GHC.Num』ninstance Num Integer -- Defined in 『GHC.Num』ninstance Num Int -- Defined in 『GHC.Num』ninstance Num Float -- Defined in 『GHC.Float』ninstance Num Double -- Defined in 『GHC.Float』n

:l 即:load 載入.hs文件,這樣你就可以在repl里運行裡面的函數了

*Nat> :l Nat.hsn[1 of 1] Compiling Nat ( Nat.hs, interpreted )nOk, modules loaded: Nat.n

:r 即:reload,重新載入剛才載入的文件,這樣你在修改文件後,:r一下就可以了,很簡單就不演示了。

除了repl外,你還需要個編輯器,我以前一直用atom+haskell插件,最近入手了haskellformac,顧名思義只有Mac版,售價128軟妹幣,極力推薦。2016.6.21修正,這個編輯器用來做練習是非常好的,要用來做生產項目還是不太成熟)

這個編輯器把界面分為項目資源管理區、編輯區和playground。 在編輯區寫的hs代碼,可以在playground里嘗試著玩玩,結果立刻顯示,而且隨著你編輯代碼文件,playgound里的內容會自動重運算。 相當於自帶repl+自動:l :r

環境基本準備好了,後面就可以開始肝了。特別鳴謝@閱千人而惜知己 ,他寫了haskell函數式編程入門一書,上面的截圖就是我在肝他這本書時敲的代碼。

開坑第一篇就寫到這,後面準備每周一篇的速度慢慢填坑。

最後留一行有趣的代碼,大家可以在自己的repl里試試哦~

Prelude> let 1 + 1 = 3nPrelude> 1 + 1n3n

推薦閱讀:

大家對於徐昊的《對象已死?》這篇文章怎麼看?
用哪些編程語言寫出的代碼,讀著能感受到美?
給 Haskell 用家的 Idris 入坑指南
Erlang入門教程 - 12. If 和Case
Stackage 鏡像使用說明

TAG:Haskell | 函数式编程 |