Haskell 入門筆記(一)

一句話介紹:Haskell 是一門純粹的函數(shù)式編程語言瞪慧。

安裝Haskell

需要一個(gè) Haskell 編譯器社痛。目前來說最流行的 Haskell 的編譯器是 Glasgow Haskell Compiler(GHC),我使用的就是這樣一個(gè)編譯器掀抹。
一般來說持舆,我們會(huì)安裝 Haskell Platform样勃,因?yàn)樗粌H包含了 Haskell 編譯器,還綁定了一下常用的庫嗦董。Haskell 的官方網(wǎng)站是:http://www.haskell.org/母谎。 不管是 Windows 版本、Linux 版本京革、Unix 版本都有奇唤。

我使用的是 Ubuntu 系統(tǒng),使用 apt-get 安裝其實(shí)很簡單,只需要一條命令就好啦:

sudo apt-get install haskell-platform

GHC 不但可以編譯 Haskell 腳本(.hs文件)匹摇,也可以以交互式方式運(yùn)行咬扇。要啟動(dòng)交互模式,在終端中輸入:

ghci

這時(shí)廊勃,中斷會(huì)輸出一些信息:

GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>

如果在 Haskell 文件中定義了一些函數(shù)懈贺,可以在 GHC 交互式解析器中輸入:

:l myFunctions

來載入你定義的函數(shù)。 l 是 load 的首字母供搀。

基本算數(shù)操作

算數(shù)操作基本上和 Java 等其他語言都比較類似隅居,直接舉幾個(gè)例子:

Prelude> 2 + 3
5
Prelude> 2 * 3
6
Prelude> 2 - 3
-1
Prelude> 2 / 3
0.6666666666666666

需要特別注意的事情是,在使用負(fù)數(shù)的時(shí)候葛虐,最好是使用括號(hào)胎源,舉個(gè)例子:

Prelude> 2 * -3
<interactive>:7:1:
 Precedence parsing error 
cannot mix `*' [infixl 7] and prefix `-' [infixl 6] in the same infix expression

布爾代數(shù)

Haskell 的與、或屿脐、非其實(shí)也很直接涕蚤,直接看例子:

Prelude> True && False
False
Prelude> True && True
True
Prelude> True || False
True
Prelude> not False
True

判斷是否相等、是否不等:

Prelude> 2 == 3
False
Prelude> 2 /= 3
True

實(shí)際上盡管我們沒有提過函數(shù)的诵,但是其實(shí)已經(jīng)用到了函數(shù)万栅,* 運(yùn)算實(shí)際上是一個(gè)函數(shù),它接收兩個(gè)參數(shù)西疤,上面那種形式叫做中綴函數(shù)烦粒,但是實(shí)際上大部分函數(shù)是以前綴函數(shù)的形式調(diào)用的,下面介紹幾個(gè):

Prelude> succ 8
9
Prelude> max 7 8
8
Prelude> min 8 9
8
Prelude> div 9 2
4

函數(shù)需要注意的

這幾個(gè)函數(shù)的作用非常明顯。但是需要注意的是 div 函數(shù)其實(shí)等價(jià)于 Java 語言中的 /運(yùn)算符扰她,小數(shù)部分是舍棄的兽掰。上面的函數(shù)我們也可以以中綴函數(shù)的形式調(diào)用,比如:

Prelude>  9 `div` 2
4

我們可以定義自己的函數(shù)徒役,函數(shù)定義的格式如下:

函數(shù)名 = 函數(shù)代碼

我們新建一個(gè) .hs文件孽尽,在其中定義一個(gè)函數(shù):

doubleMe x =  x * 2

在交互式解析器中輸入 :l file.hs 加載你所定義的函數(shù),這時(shí)忧勿,解析器會(huì)輸出如下信息:

Prelude> :l baby.hs
[1 of 1] Compiling Main ( baby.hs, interpreted )
Ok, modules loaded: Main.
*Main>

接下來就可以使用你所定義的函數(shù)了:

*Main> doubleMe 2
4

在定義別的函數(shù)的時(shí)候可以使用已經(jīng)定義的函數(shù)杉女,例如:

doubleUs x y = x * 2 + y * 2

Haskell 中也有 if 表達(dá)式,但是與 Java 語言的 if 表達(dá)式有一些區(qū)別鸳吸,我們先看一個(gè)例子:

doubleSmallNumber x = if x > 100 then x else x * 2

這個(gè)函數(shù)的意思是熏挎,如果一個(gè)數(shù)小于等于 100,就翻倍层释,否則保持不變婆瓜。但是需要注意的是,Haskell中的 else 部分是必須有的贡羔。此外還需要注意的是廉白,Haskell 函數(shù)名的首字母必須小寫
如果函數(shù)沒有參數(shù)乖寒,那么這樣的函數(shù)在 Haskell 中叫做定義或者名稱猴蹂。這一點(diǎn)有點(diǎn)類似于 Java 中的變量,但是有非常重要的區(qū)別:Haskell 中的定義一旦給出就不允許改變楣嘁。

List概述

Haskell 中的 List 是一種比較均勻整齊的數(shù)據(jù)結(jié)構(gòu)磅轻,之所以說它均勻整齊是因?yàn)槠渲械脑乇仨毷?strong>相同類型的。List 是被方括號(hào)包裹起來的:

*Main> let nums = [1,2,3,4]
*Main> nums
[1,2,3,4]

在 GHCi 中需要使用 let 來定義一個(gè) List逐虚。List 有很多操作聋溜,下面分別介紹。

  • List連接操作

使用 ++ 來連接兩個(gè) List:

*Main> nums ++ [5,6]
[1,2,3,4,5,6]

在 Haskell 中叭爱,字符串實(shí)際上就是列表撮躁,也可以使用 ++ 進(jìn)行連接操作:

*Main> "Hello," ++ " " ++ "World!"
"Hello, World!"

可以使用 : 操作符將一個(gè)元素放到一個(gè)列表最前面

*Main> 0 : [1,2,3]
[0,1,2,3]

可以使用 !! 使用索引訪問 List 中的元素:

*Main> [1,2,3,4] !! 3
4

索引號(hào)是從 0 開始的。

  • List 比較大小

List 比較大小的前提是 List 元素是可以比較的买雾,比如說數(shù)字把曼,比如說字母(按照字母表順序)。比較的規(guī)則是以此比較每一個(gè)元素直到出現(xiàn)不同的元素漓穿,那第一個(gè)不同元素嗤军,元素大的 List 大:

*Main> [1,2,3] < [1,2,4]
True
*Main> [1,2,3] < [1,2,3]
False
*Main> [1,2,3] < [1,2,2]
False
  • 其他List操作
函數(shù) 說明
head 可以取出List的首元素
tail 將List去掉首元素
last 返回List的末尾元
init 返回除最后一個(gè)元素之前的所有元素構(gòu)成的 List
length 返回元素個(gè)數(shù)
null 判斷 List 是否為空列表
take n [...] 從列表中取出 n 個(gè)元素
drop n [...] 忽略 n 個(gè)元素后返回 List
maximum/minimum 取出最大/最小值
sum 所有元素求和
product 所有元素乘積
elem 判斷元素是否在列表中
reverse List 倒置
*Main> head [1,2,3]
1
*Main> tail [1,2,3]
[2,3]
*Main> last [1,2,3]
3
*Main> init [1,2,3]
[1,2]
*Main> take 3 [1,2,3,4,5,6]
[1,2,3]
*Main> drop 3 [1,2,3,4,5,6]
[4,5,6]
*Main> length [1,2,3]
3
*Main> null []
True
*Main> reverse [1,2,3]
[3,2,1]
*Main> maximum [1,2,3]
3
*Main> minimum [1,2,3]
1
*Main> sum [1,2,3]
6
*Main> product [1,2,3]
6
*Main> 4 `elem` [1,2,3,5]
False

根據(jù)來源 整理為 Markdown 格式。

把為知筆記轉(zhuǎn)移到簡書上來, 做一個(gè)筆記的分類晃危。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叙赚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纠俭,老刑警劉巖沿量,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冤荆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)权纤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門钓简,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汹想,你說我怎么就攤上這事外邓。” “怎么了古掏?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵损话,是天一觀的道長。 經(jīng)常有香客問我槽唾,道長丧枪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任庞萍,我火速辦了婚禮拧烦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钝计。我一直安慰自己恋博,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布私恬。 她就那樣靜靜地躺著债沮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪本鸣。 梳的紋絲不亂的頭發(fā)上疫衩,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音永高,去河邊找鬼隧土。 笑死,一個(gè)胖子當(dāng)著我的面吹牛命爬,可吹牛的內(nèi)容都是我干的曹傀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饲宛,長吁一口氣:“原來是場噩夢啊……” “哼皆愉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤幕庐,失蹤者是張志新(化名)和其女友劉穎久锥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體异剥,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑟由,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冤寿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歹苦。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖督怜,靈堂內(nèi)的尸體忽然破棺而出殴瘦,到底是詐尸還是另有隱情,我是刑警寧澤号杠,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布蚪腋,位于F島的核電站,受9級(jí)特大地震影響姨蟋,放射性物質(zhì)發(fā)生泄漏屉凯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一芬探、第九天 我趴在偏房一處隱蔽的房頂上張望神得。 院中可真熱鬧,春花似錦偷仿、人聲如沸哩簿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽节榜。三九已至,卻和暖如春别智,著一層夾襖步出監(jiān)牢的瞬間宗苍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工薄榛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讳窟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓敞恋,卻偏偏與公主長得像丽啡,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硬猫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容