我的博客地址:鏈接
CHAPTER 2: 類(lèi)型與函數(shù)
為什么要關(guān)注類(lèi)型?
了解Haskell的類(lèi)型系統(tǒng)可以更好的根據(jù)其特性,寫(xiě)出精確的跪腹、健壯的代碼褂删。
Haskell的類(lèi)型系統(tǒng)
Haskell類(lèi)型系統(tǒng)的三大特征
1.強(qiáng)類(lèi)型
每個(gè)表達(dá)式和函數(shù)都有確定的類(lèi)型。Hasekll的編譯器或者解釋器在我們使用一個(gè)表達(dá)式時(shí)會(huì)檢測(cè)他的類(lèi)型是否匹配冲茸,一旦發(fā)現(xiàn)不匹配則會(huì)拒絕執(zhí)行這段代碼并返回一個(gè)錯(cuò)誤消息屯阀。(而不是做自動(dòng)類(lèi)型轉(zhuǎn)換)
2.靜態(tài)類(lèi)型
編譯時(shí)確定每一個(gè)變量的類(lèi)型而不是在運(yùn)行時(shí)缅帘。
3.自動(dòng)推導(dǎo)
Haskell有強(qiáng)大的類(lèi)型推導(dǎo)系統(tǒng)。
類(lèi)型系統(tǒng)給了我們什么
靜態(tài)难衰、強(qiáng)類(lèi)型檢查使得 Haskell 更安全股毫,而類(lèi)型推導(dǎo)則讓它更精煉、簡(jiǎn)潔召衔。這樣得出的的結(jié)果是铃诬,比起其他流行的靜態(tài)語(yǔ)言,Haskell 要來(lái)得更安全苍凛,而比起其他流行的動(dòng)態(tài)語(yǔ)言趣席, Haskell 的表現(xiàn)力又更勝一籌。
一些常用的基本類(lèi)型
Char
Bool
Int
Intger
Double
一些常用的函數(shù)
odd
compare
列表與元組
List:[1,2,3,4]
Tuple:("abc",1)
列表與元組相關(guān)函數(shù)
List:take醇蝴、drop
Tuple:fst宣肚、snd
函數(shù)類(lèi)型與純度
副作用:副作用本質(zhì)上是函數(shù)的一種不可見(jiàn)的(invisible)輸入或輸出。
我們將帶副作用的函數(shù)稱(chēng)為“不純(impure)函數(shù)”悠栓,而將不帶副作用的函數(shù)稱(chēng)為“純(pure)函數(shù)”霉涨。
理解求值
變量不可賦值
惰性求值
多態(tài)
參數(shù)多態(tài):Haskell 的參數(shù)多態(tài)直接影響了 Java 和 C# 等語(yǔ)言的泛型(generic)功能的設(shè)計(jì)。Java 泛型中的類(lèi)型變量和 Haskell 的參數(shù)化類(lèi)型非常相似惭适。而 C++ 的模板也和參數(shù)多態(tài)相去不遠(yuǎn)笙瑟。
子類(lèi)多態(tài):繼承,Haskell不是面向?qū)ο篑荆恢С?br>
強(qiáng)制多態(tài):隱式轉(zhuǎn)換往枷,Haskell堅(jiān)決反對(duì)
為什么要對(duì)純度斤斤計(jì)較?
軟件的大部分風(fēng)險(xiǎn)凄杯,都來(lái)自于與外部世界進(jìn)行交互:它需要程序去應(yīng)付錯(cuò)誤的错洁、不完整的數(shù)據(jù),并且處理惡意的攻擊戒突,諸如此類(lèi)屯碴。Haskell 的類(lèi)型系統(tǒng)明確地告訴我們,哪一部分的代碼帶有副作用膊存,讓我們可以對(duì)這部分代碼添加適當(dāng)?shù)谋Wo(hù)措施导而。
總結(jié)
這一章對(duì) Haskell 的類(lèi)型系統(tǒng)以及類(lèi)型語(yǔ)法進(jìn)行了快速的概覽,了解了基本類(lèi)型膝舅,并學(xué)習(xí)了如何去編寫(xiě)簡(jiǎn)單的函數(shù)嗡载。這章還介紹了多態(tài)、條件表達(dá)式仍稀、純度和惰性求值。
參考:
《Real World Haskell》 Bryan O'Sullivan, Don Stewart, and John Goerzen
《Real World Haskell》 中文翻譯項(xiàng)目