Haskell系列教程(一)簡介

Haskell特性

  • 簡潔的程序風(fēng)格
  • 強大的類型系統(tǒng)
  • List comprehensions(wiki的意思就是有基于存在的lists創(chuàng)建一個list的能力)
  • 遞歸函數(shù)
  • 高階函數(shù)(接受函數(shù)為參數(shù),返回值為函數(shù))
  • Effectful函數(shù)(就是純函數(shù)的反義詞。Haskell提供了統(tǒng)一的框架來處理副作用)
  • 泛型函數(shù)
  • 惰性求值
  • 等式推導(dǎo)

Haskell初體驗

以下只為體驗,不為詳解。

第一個例子神凑,求和函數(shù)

sum函數(shù)的定義
sum [] = 0 -- 等號左邊為函數(shù)聲明,右邊為函數(shù)體
-- 這里我們定義了一個函數(shù)sum,接受一個空列表為參數(shù),返回值為0

sum (n:ns) = n + sum ns --遞歸定義
-- (n:ns)為一個list帘瞭,n代表list中的第一個元素淑掌,ns代表list中除了第一個元素以外剩下的元素蒿讥,ns等于是子list
-- 這里相當(dāng)于重載了sum函數(shù)的定義,接受一個list為參數(shù)抛腕,返回值為:第一個元素 + 子列表的和(遞歸調(diào)用sum)
sum函數(shù)的類型
sum :: Num a => [a] -> a
-- 箭頭左邊限定a的類型為Num芋绸;箭頭右邊的為函數(shù)類型定義,即接受一個列表担敌,列表中的數(shù)據(jù)為a摔敛,返回值為a
sum函數(shù)的計算過程
sum [1, 2, 3]
-- 1. 根據(jù)函數(shù)定義可推導(dǎo)出 sum [1, 2, 3] = 1 + sum [2, 3]
-- 2. 以此類推 1 + sum [2, 3] = 1 + 2 + sum [3]
-- 3. 1 + 2 + sum [3] = 1 + 2 + 3 + sum []
-- 4. 1 + 2 + 3 + sum [] = 1 + 2 + 3 + 0 (根據(jù)函數(shù)定義sum [] = 0)
-- 5. 最后答案為6

第二個例子,快排函數(shù)

quicksort函數(shù)的定義
quicksort [] = [] --參數(shù)值為空列表時全封,返回值為空列表
quicksort (x:xs) = quicksort smaller ++ [x] ++ quicksort larger
                   where
                     smaller = [a | a <- xs, a <= x]
                     larger = [b | b <- xs, b > x]
  • ++操作符把兩個list連接起來马昙,[1,2,3] ++ [4,5] = [1,2,3,4,5]
  • smaller為子列表桃犬,在where中做了限定,即smaller中的元素a行楞,取值于子列表xs攒暇,且a的值小于等于x。x為原始列表的第一個值子房。也就是說形用,smaller這個子列表中的數(shù)據(jù)都比x小或者等于x
  • 同理,larger這個子列表中的數(shù)據(jù)都比x來的大
quicksort函數(shù)的類型
quickesort :: Ord a => [a] -> [a]
-- 數(shù)據(jù)a限定為Ord類型证杭。該函數(shù)接受一個列表為參數(shù)田度,列表中的數(shù)據(jù)為a,返回一個列表解愤,列表的數(shù)據(jù)為a
quicksort函數(shù)的計算過程
quicksort [1]
-- 1. quicksort [] ++ [1] ++ quicksort [] (根據(jù)定義镇饺,比1小的列表為空,比1大的列表為空)
-- 2. [] ++ [1] ++ [] (根據(jù)定義琢歇,quicksort [] = [])
-- 3. 結(jié)果為[1]

quicksort [3, 4, 5, 1, 2, 3]
-- 1. quicksort [1, 2, 3] ++ [3] ++ quicksort[4, 5]
-- 2. (quicksort [] ++ [1] ++ quicksort [2, 3]) ++ [3] ++ (quicksort [] ++ [4] ++ quicksort [5])
-- 3. ([] ++ [1] ++ (quicksort [] ++ [2] ++ quicksort [3])) ++ [3] ++ ([] ++ [4] ++ [5])
-- 4. ([] ++ [1] ++ ([] ++ [2] ++ [3])) ++ [3] ++ ([] ++ [4] ++ [5])
-- 5. 結(jié)果為[1, 2, 3, 3, 4, 5]

第三個例子兰怠,帶有副作用操作的函數(shù)

seqacts函數(shù)的定義

seqacts函數(shù)接受一個列表,列表里是一系列輸入或者輸出操作李茫,比如在控制臺讀取或者寫入字符揭保。

seqacts [] = return [] -- 此return非彼return。這里的return為一函數(shù)魄宏,用于將值包裝進IO秸侣。因此此處的返回值為IO []
seqacts (act:acts) = do x <- act -- 當(dāng)列表不為空時,先運行第一個操作宠互,返回值為x
                        xs <- seqacts acts -- 對子列表繼續(xù)調(diào)用seqacts函數(shù)
                        return (x:xs) -- 返回值為IO [a]
seqacts函數(shù)的類型

通過上面的定義可以推導(dǎo)出類型為:

seqacts :: [IO a] -> IO [a]
-- 輸入輸出操作是有副作用的操作味榛,在Haskell中用IO表示副作用操作(這里可以把IO想成函數(shù))。而a表示副作用操作的返回值(函數(shù)的返回值)
-- 返回值是一個副作用操作予跌,這個副作用操作的返回值是一個列表搏色,列表中的數(shù)據(jù)為a(可以這樣想,返回值是個函數(shù)券册,這個函數(shù)的返回值是個[a])频轿。為什么這里不直接返回[a],因為seqacts函數(shù)涉及了IO烁焙,返回值則也要用IO包裝

IO也是有類型的航邢,因此函數(shù)類型可以進一步抽象為:

seqacts :: Monad m => [m a] -> m [a]
-- Monad就像上兩例中的Num和Ord

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骄蝇,隨后出現(xiàn)的幾起案子膳殷,更是在濱河造成了極大的恐慌,老刑警劉巖九火,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赚窃,死亡現(xiàn)場離奇詭異册招,居然都是意外死亡,警方通過查閱死者的電腦和手機勒极,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門跨细,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人河质,你說我怎么就攤上這事冀惭。” “怎么了掀鹅?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵散休,是天一觀的道長。 經(jīng)常有香客問我乐尊,道長戚丸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任扔嵌,我火速辦了婚禮限府,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘痢缎。我一直安慰自己胁勺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布独旷。 她就那樣靜靜地躺著署穗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嵌洼。 梳的紋絲不亂的頭發(fā)上案疲,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音麻养,去河邊找鬼褐啡。 笑死,一個胖子當(dāng)著我的面吹牛鳖昌,可吹牛的內(nèi)容都是我干的备畦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼遗遵,長吁一口氣:“原來是場噩夢啊……” “哼萍恕!你這毒婦竟也來了逸嘀?” 一聲冷哼從身側(cè)響起车要,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤残拐,失蹤者是張志新(化名)和其女友劉穎渗磅,沒想到半個月后祥楣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寿桨,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年琅坡,在試婚紗的時候發(fā)現(xiàn)自己被綠了悉患。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡榆俺,死狀恐怖售躁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茴晋,我是刑警寧澤陪捷,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站诺擅,受9級特大地震影響市袖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烁涌,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一苍碟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撮执,春花似錦微峰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至继效,卻和暖如春症杏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瑞信。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工厉颤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凡简。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓逼友,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秤涩。 傳聞我的和親對象是個殘疾皇子帜乞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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