Haskell筆記2

1 Polymorphic Types

在很多情況下帜慢,不同的數(shù)據(jù)類型會有相同功能的函數(shù)瘦真,例如判定相等或者不等绰播,List的append等等花枫。如果我們對每一個都單獨定義的話刻盐,會產(chǎn)生非常多的功能一致但只有類型不同的函數(shù)。在這種情況下劳翰,polymorphic type就顯得十分有用敦锌。

例如 reverse 函數(shù), 他將一個list顛倒過來佳簸。 我們希望它對各種類型都適用那么就可定義:

reverse::[a] ->[a]

注意此處 a 即任意一種類型乙墙,[a]是顯式的指明它為一個List型的類型。但是a也可以為List,[a]可以為以一種類型的list的list伶丐。

再比如說zip悼做,

zip::[a]->[b]->[(a,b)]

此處a,b可以為一種類型,也可以為不同類型哗魂。

2 Higher-order functions

先簡單介紹一下普通的function肛走。

最基本的函數(shù)其類型是:

T->R

T,R指任意類型,T為函數(shù)的參數(shù)录别,R為函數(shù)的輸出值朽色。

在函數(shù)定義時,例如higher-order function组题, 我們可以不必再原始定義中給出參數(shù)葫男,而是在第一次需要參數(shù)時給出定義。例如我們有函數(shù)

f::(a->a)->(a->b)->a->b

f func1 func2 = func3

? ? ? ? ? ? ? ? ? ? ? ? ? where func3 input = if func1 input then func2 input

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else input

在函數(shù)定義的最初崔列,我們并沒有定義 input(函數(shù)參數(shù))梢褐,但是這并不影響函數(shù)定義的合法性。 我們在func3中調用了它赵讯。這么做可以提高程序可讀性盈咳。

另外,如果在函數(shù)中應用了lambda expression, 我們也可以在函數(shù)中省略參數(shù)边翼,這只是一個參數(shù)聲明的平移鱼响,因為我們還會在第一次用到參數(shù)時定義它。例如:

f::Int->Int

f = (\x->x+x)

雖然我們沒有以正常的f x =..來定義函數(shù)组底,但是在anonymous function中我們還是給出了定義丈积。

Haskell中,所有的函數(shù)都接收一個參數(shù)债鸡,返回一個值江滨。那么如何解釋之前寫過的接收多個參數(shù)的函數(shù)?

----它們被稱之為Curried functions(哎娘锁,我也不知道為什么Haskell有這么多和食物有關的術語牙寞,可能大佬是個吃貨吧)。

舉一個簡單的例子---

引用Learn You a Haskell for Great Good!?

http://learnyouahaskell.com/higher-order-functions

max:: Int->Int->Int

我們不管這個函數(shù)如何實現(xiàn)莫秆,總之它會選出兩個數(shù)之中較大的一個间雀。

這個函數(shù)接收第一個參數(shù)后,會返回一個接收Int的函數(shù)镊屎,最終返回a惹挟。

另一種寫法為 a->(a->a), 看,它返回的是一個函數(shù)缝驳!

如果我們定義一個函數(shù)是 f = max 3,我們再調用f的時候连锯,實際上是把缺少的一個參數(shù)補給了max归苍。

這種應用函數(shù)的方法為 --- partial application。

回到Higher order functions來运怖,對應只接受一個參數(shù)的函數(shù)它是first order,剩余的即higher order拼弃。higher order中會以函數(shù)作為參數(shù),在函數(shù)定義中以括號標識出來摇展,例如:

f:: (a->a)->b->(a,b)

(a->a)即以個以a為參數(shù)返回a的函數(shù)吻氧。

3 Lambda-abstractions

Lambda abstractions實際上是為了創(chuàng)造anonymous function,可以在定義函數(shù)之間方便的構造一個新的輔助函數(shù)咏连。它的大概形式如下:

(\x -> x + x) x盯孙; (\x y -> x+y) x y

括號中為函數(shù)的定義,括號外緊跟的為函數(shù)的輸入祟滴,它會替代所有x(在\x->中)振惰,或者二元的話就將對應替代---第一個數(shù)對應第一個參數(shù),第二個對應第二個參數(shù)垄懂。

稍微復雜點的形式可以是嵌套的

大致為: \x-> (\y..) 這實際上為f.y

一個復雜一點的例子:

map (\x -> (map (\y->(x,y)) [1..10])) [0..9]

map函數(shù)對[0..9]的每一個元素都調用了中間的函數(shù)骑晶,而中間的關于x的函數(shù)是關于另一個map的函數(shù),這個map中又有關于y的函數(shù)草慧。它實際上等效于list:

[(x,y)|x<-[0..9],y<-[1..10]]

值得注意的一點是透罢,transition的關系只有在括號的嵌套之中才有,如果是括號之外的另外一個anonymous function冠蒋,那么就無任何關系,例如:

((\x-> x+1) 2) + ((\x->x+2) 3)

它的輸出為8.

4 Higher order function 與? list

所有的list乾胶,都可以由concat,filter,map函數(shù)構造出來抖剿。

例如:

original = [ (x,y) | x <- [1..100], y <- [1..x], x `mod` y > 0 ]

它可以被改寫為:

alternative = concat (map(\x->(map (\y->(x,y)) (filter (\y-> x`mod`y>0) [1..x]))) [1..100])

需要提醒的一點是,在\x->之后的括號中都為關于x的函數(shù)识窿,所以x可以被用于任何一個子函數(shù)中斩郎,但是filter,map為分開的兩個函數(shù),所以關于y的兩個函數(shù)并無關聯(lián)喻频。

5 List Function

以list為參數(shù)的function需要注意函數(shù)的non-exhaustive即詳盡性或者全面性缩宜。

使用x:xs迭代性可避免各種各樣的pattern match缺失。

6 ':' operator 與 '++' operator

':' operator 與 '++' 都是返回list的operator甥温,但是:

':'? 它接受一個任意類型參數(shù)加一個此類型的list參數(shù)锻煌,具體來講是把一個參數(shù)放到一個list的首位。即類似: 1:[2,3,4] = [1,2,3,4] 或者 [1,2]:[[3,4],[5,6]] = [[1,2],[3,4],[5,6]]

a->[a]->[a]

'++': 它接受兩個list類型參數(shù)姻蚓,并把第二個連入第一個的尾部宋梧。即類似:

[1,2] ++ [3,4] = [1,2,3,4]

[a]->[a]->[a]

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狰挡,隨后出現(xiàn)的幾起案子捂龄,更是在濱河造成了極大的恐慌释涛,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倦沧,死亡現(xiàn)場離奇詭異唇撬,居然都是意外死亡,警方通過查閱死者的電腦和手機展融,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門窖认,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愈污,你說我怎么就攤上這事耀态。” “怎么了暂雹?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵首装,是天一觀的道長。 經(jīng)常有香客問我杭跪,道長仙逻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任涧尿,我火速辦了婚禮系奉,結果婚禮上,老公的妹妹穿的比我還像新娘姑廉。我一直安慰自己缺亮,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布桥言。 她就那樣靜靜地躺著萌踱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪号阿。 梳的紋絲不亂的頭發(fā)上并鸵,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音扔涧,去河邊找鬼园担。 笑死,一個胖子當著我的面吹牛枯夜,可吹牛的內(nèi)容都是我干的弯汰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼湖雹,長吁一口氣:“原來是場噩夢啊……” “哼蝙泼!你這毒婦竟也來了?” 一聲冷哼從身側響起劝枣,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汤踏,失蹤者是張志新(化名)和其女友劉穎织鲸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溪胶,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡搂擦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哗脖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瀑踢。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖才避,靈堂內(nèi)的尸體忽然破棺而出橱夭,到底是詐尸還是另有隱情,我是刑警寧澤桑逝,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布棘劣,位于F島的核電站,受9級特大地震影響楞遏,放射性物質發(fā)生泄漏茬暇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一寡喝、第九天 我趴在偏房一處隱蔽的房頂上張望糙俗。 院中可真熱鬧,春花似錦预鬓、人聲如沸巧骚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽网缝。三九已至,卻和暖如春蟋定,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背草添。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工驶兜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人远寸。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓抄淑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驰后。 傳聞我的和親對象是個殘疾皇子肆资,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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