動(dòng)手實(shí)踐書(shū)中想象力豐富、略有點(diǎn)兒瘋狂的示例,你將能夠:揮舞純函數(shù)式編程技法,笑看各種“副作用”。施展Haskell的“惰性”魔法,處理無(wú)限數(shù)據(jù)集。通過(guò)自定義類(lèi)型、類(lèi)型類(lèi)和模塊來(lái)組織程序。使用Haskell優(yōu)雅的輸入/輸出系統(tǒng)與外部世界分享程序的靈魂。學(xué)習(xí)Haskell這門(mén)強(qiáng)大的語(yǔ)言,再?zèng)]有比閱讀這本書(shū)更好的方法了!
"目 錄
第1章 各就各位,預(yù)備! 1
1.1 調(diào)用函數(shù) 3
1.2 小朋友的第一個(gè)函數(shù) 4
1.3 列表入門(mén) 6
1.3.1 拼接列表 6
1.3.2 訪問(wèn)列表中的元素 8
1.3.3 嵌套列表 8
1.3.4 比較列表 8
1.3.5 更多列表操作 9
1.4 得州區(qū)間 11
1.5 我是列表推導(dǎo)式 13
1.6 元組 16
"目 錄
第1章 各就各位,預(yù)備! 1
1.1 調(diào)用函數(shù) 3
1.2 小朋友的第一個(gè)函數(shù) 4
1.3 列表入門(mén) 6
1.3.1 拼接列表 6
1.3.2 訪問(wèn)列表中的元素 8
1.3.3 嵌套列表 8
1.3.4 比較列表 8
1.3.5 更多列表操作 9
1.4 得州區(qū)間 11
1.5 我是列表推導(dǎo)式 13
1.6 元組 16
1.6.1 使用元組 16
1.6.2 使用序?qū)Α?7
1.6.3 找直角三角形 18
第2章 相信類(lèi)型 20
2.1 顯式類(lèi)型聲明 20
2.2 Haskell的常見(jiàn)類(lèi)型 21
2.3 類(lèi)型變量 22
2.4 類(lèi)型類(lèi)入門(mén) 23
2.4.1 Eq類(lèi)型類(lèi) 24
2.4.2 Ord類(lèi)型類(lèi) 24
2.4.3 Show類(lèi)型類(lèi) 25
2.4.4 Read類(lèi)型類(lèi) 25
2.4.5 Enum類(lèi)型類(lèi) 27
2.4.6 Bounded類(lèi)型類(lèi) 27
2.4.7 Num類(lèi)型類(lèi) 28
2.4.8 Floating類(lèi)型類(lèi) 28
2.4.9 Integeral類(lèi)型類(lèi) 28
2.4.10 有關(guān)類(lèi)型類(lèi)的最后總結(jié) 29
第3章 函數(shù)的語(yǔ)法 30
3.1 模式匹配 30
3.1.1 元組的模式匹配 32
3.1.2 列表與列表推導(dǎo)式的模式匹配 32
3.1.3 As模式 34
3.2 注意,哨衛(wèi)! 34
3.3 where?! 36
3.3.1 where的作用域 37
3.3.2 where中的模式匹配 38
3.3.3 where塊中的函數(shù) 38
3.4 let 39
3.4.1 列表推導(dǎo)式中的let 40
3.4.2 GHCi中的let 40
3.5 case表達(dá)式 41
第4章 你好,遞歸 43
4.1 不可思議的最大值 43
4.2 更多的幾個(gè)遞歸函數(shù) 45
4.2.1 replicate 45
4.2.2 take 45
4.2.3 reverse 46
4.2.4 repeat 46
4.2.5 zip 46
4.2.6 elem 47
4.3 快點(diǎn),排序! 47
4.3.1 算法思路 47
4.3.2 編寫(xiě)代碼 48
4.4 遞歸地思考 49
第5章 高階函數(shù) 50
5.1 柯里函數(shù) 50
5.1.1 截?cái)唷?2
5.1.2 打印函數(shù) 53
5.2 再來(lái)點(diǎn)兒高階函數(shù) 53
5.2.1 實(shí)現(xiàn)zipWith 54
5.2.2 實(shí)現(xiàn)flip 55
5.3 函數(shù)式程序員工具箱 56
5.3.1 map函數(shù) 56
5.3.2 filter函數(shù) 57
5.3.3 有關(guān)map與filter的更多示例 58
5.3.4 映射帶有多個(gè)參數(shù)的函數(shù) 60
5.4 lambda 60
5.5 折疊紙鶴 62
5.5.1 通過(guò)foldl進(jìn)行左折疊 63
5.5.2 通過(guò)foldr進(jìn)行右折疊 63
5.5.3 foldl1函數(shù)與foldr1函數(shù) 64
5.5.4 折疊的幾個(gè)例子 65
5.5.5 另一個(gè)角度看折疊 66
5.5.6 無(wú)限列表的折疊 67
5.5.7 掃描 68
5.6 有$的函數(shù)應(yīng)用 68
5.7 函數(shù)組合 70
5.7.1 帶有多個(gè)參數(shù)函數(shù)的組合 70
5.7.2 Point-Free風(fēng)格 71
第6章 模塊 73
6.1 導(dǎo)入模塊 73
6.2 使用模塊中的函數(shù)求解問(wèn)題 75
6.2.1 統(tǒng)計(jì)單詞數(shù) 75
6.2.2 干草堆中的縫紉針 76
6.2.3 凱撒密碼沙拉 77
6.2.4 嚴(yán)格左折疊 79
6.2.5 尋找酷數(shù) 80
6.3 映射鍵與值 82
6.3.1 幾乎一樣好:關(guān)聯(lián)列表 82
6.3.2 進(jìn)入Data.Map 83
6.4 構(gòu)造自己的模塊 87
6.4.1 幾何模塊 87
6.4.2 模塊的層次結(jié)構(gòu) 89
第7章 構(gòu)造我們自己的類(lèi)型和類(lèi)型類(lèi) 91
7.1 定義新的數(shù)據(jù)類(lèi)型 91
7.2 成型 92
7.2.1 借助Point數(shù)據(jù)類(lèi)型優(yōu)化Shape數(shù)據(jù)類(lèi)型 93
7.2.2 將圖形導(dǎo)出到模塊中 94
7.3 記錄語(yǔ)法 95
7.4 類(lèi)型參數(shù) 97
7.4.1 要不要參數(shù)化我們的汽車(chē)? 99
7.4.2 末日向量 100
7.5 派生實(shí)例 102
7.5.1 相同的人 102
7.5.2 告訴我怎么讀 103
7.5.3 法庭內(nèi)保持秩序! 104
7.5.4 一周的一天 105
7.6 類(lèi)型別名 106
7.6.1 使我們的電話本更好看些 107
7.6.2 參數(shù)化類(lèi)型別名 108
7.6.3 向左走,向右走 109
7.7 遞歸數(shù)據(jù)結(jié)構(gòu) 111
7.7.1 優(yōu)化我們的列表 111
7.7.2 種一棵樹(shù) 113
7.8 類(lèi)型類(lèi) 115
7.8.1 深入Eq類(lèi)型類(lèi) 116
7.8.2 TrafficLight數(shù)據(jù)類(lèi)型 116
7.8.3 子類(lèi)化 118
7.8.4 作為類(lèi)型類(lèi)實(shí)例的帶參數(shù)類(lèi)型 118
7.9 Yes-No類(lèi)型類(lèi) 120
7.10 Functor類(lèi)型類(lèi) 122
7.10.1 Maybe函子 124
7.10.2 樹(shù)也是函子 124
7.10.3 Either a函子 125
7.11 kind與無(wú)名類(lèi)型 126
第8章 輸入與輸出 128
8.1 純粹與非純粹的分離 128
8.2 Hello, World! 129
8.3 組合I/O操作 130
8.3.1 在I/O操作中使用let 132
8.3.2 反過(guò)來(lái) 133
8.4 幾個(gè)實(shí)用的I/O函數(shù) 135
8.4.1 putStr 135
8.4.2 putChar 135
8.4.3 print 136
8.4.4 when 137
8.4.5 sequence 137
8.4.6 mapM 138
8.4.7 forever 139
8.4.8 forM 139
8.5 I/O操作回顧 140
第9章 更多的輸入輸出操作 141
9.1 文件和流 141
9.1.1 輸入重定向 141
9.1.2 從輸入流獲取字符串 142
9.1.3 轉(zhuǎn)換輸入 144
9.2 讀寫(xiě)文件 146
9.2.1 使用withFile函數(shù) 147
9.2.2 bracket的時(shí)間到了 148
9.2.3 抓住句柄 149
9.3 TODO列表 149
9.3.1 刪除條目 150
9.3.2 清理 152
9.4 命令行參數(shù) 153
9.5 關(guān)于TODO列表的更多有趣的事 154
9.5.1 一個(gè)多任務(wù)列表 155
9.5.2 處理錯(cuò)誤的輸入 158
9.6 隨機(jī)性 159
9.6.1 擲硬幣 160
9.6.2 更多隨機(jī)函數(shù) 161
9.6.3 隨機(jī)性和I/O 162
9.7 字節(jié)串 165
9.7.1 嚴(yán)格的和惰性字節(jié)串 166
9.7.2 用字節(jié)串復(fù)制文件 167
第10章 函數(shù)式地解決問(wèn)題 169
10.1 逆波蘭式計(jì)算器 169
10.1.1 計(jì)算RPN表達(dá)式 169
10.1.2 寫(xiě)一個(gè)RPN函數(shù) 170
10.1.3 添加更多的操作符 172
10.2 從希思羅機(jī)場(chǎng)到倫敦 173
10.2.1 計(jì)算最快的路線 174
10.2.2 在Haskell中表示道路系統(tǒng) 176
10.2.3 實(shí)現(xiàn)計(jì)算最佳路徑的函數(shù) 177
10.2.4 從輸入獲取道路系統(tǒng) 179
第11章 applicative函子 182
11.1 函子再現(xiàn) 182
11.1.1 作為函子的I/O操作 183
11.1.2 作為函子的函數(shù) 185
11.2 函子定律 187
11.2.1 定律1 188
11.2.2 定律2 188
11.2.3 違反定律 189
11.3 使用applicative函子 191
11.3.1 向applicative問(wèn)好 192
11.3.2 Maybe applicative函子 192
11.3.3 applicative風(fēng)格 193
11.3.4 列表 195
11.3.5 IO也是applicative函子 197
11.3.6 函數(shù)作為applicative 198
11.3.7 zip列表 199
11.3.8 applicative定律 200
11.4 applicative的實(shí)用函數(shù) 201
第12章 Monoid 205
12.1 把現(xiàn)有類(lèi)型包裹成新類(lèi)型 205
12.1.1 用newtype創(chuàng)建類(lèi)型類(lèi)的實(shí)例 207
12.1.2 關(guān)于newtype的惰性 208
12.1.3 type、newtype和data三者的對(duì)比 210
12.2 關(guān)于那些monoid 211
12.2.1 Monoid類(lèi)型類(lèi) 212
12.2.2 monoid定律 213
12.3 認(rèn)識(shí)一些monoid 213
12.3.1 列表是monoid 213
12.3.2 Product和Sum 214
12.3.3 Any和All 216
12.3.4 Ordering monoid 217
12.3.5 Maybe monoid 219
12.4 monoid的折疊 221
第13章 更多monad的例子 224
13.1 升級(jí)我們的applicative函子 224
13.2 體會(huì)Maybe 225
13.3 Monad類(lèi)型類(lèi) 228
13.4 一往無(wú)前 229
13.4.1 代碼,代碼,代碼 230
13.4.2 我要飛走 231
13.4.3 線上的香蕉 234
13.5 do記法 235
13.5.1 按我所說(shuō)的去做 236
13.5.2 我皮埃爾又回來(lái)了 237
13.5.3 模式匹配和計(jì)算失敗 238
13.6 列表monad 239
13.6.1 do記法和列表推導(dǎo)式 241
13.6.2 MonadPlus和guard函數(shù) 242
13.6.3 馬的探索 243
13.7 monad定律 245
13.7.1 左單位元 246
13.7.2 右單位元 246
13.7.3 結(jié)合律 247
第14章 再多一些monad 249
14.1 Writer?我沒(méi)聽(tīng)說(shuō)過(guò)啊! 249
14.1.1 monad趕來(lái)營(yíng)救 251
14.1.2 Writer類(lèi)型 253
14.1.3 對(duì)Writer使用do記法 254
14.1.4 給程序添加日志 255
14.1.5 低效的列表構(gòu)造 257
14.1.6 使用差分列表 258
14.1.7 比較性能 259
14.2 Reader?呃,不開(kāi)玩笑了 260
14.2.1 作為monad的函數(shù) 261
14.2.2 Reader monad 261
14.3 帶狀態(tài)計(jì)算的優(yōu)雅表示 262
14.3.1 帶狀態(tài)的計(jì)算 263
14.3.2 棧和石頭 264
14.3.3 State monad 265
14.3.4 獲取和設(shè)置狀態(tài) 267
14.3.5 隨機(jī)性和State monad 268
14.4 墻上的Error 269
14.5 一些實(shí)用的monad式的函數(shù) 271
14.5.1 liftM和它的朋友們 271
14.5.2 join函數(shù) 274
14.5.3 filterM 276
14.5.4 foldM 278
14.6 創(chuàng)建一個(gè)安全的RPN計(jì)算器 279
14.7 組合monad式的函數(shù) 281
14.8 創(chuàng)建monad 282
第15章 zipper 287
15.1 在樹(shù)上移動(dòng) 287
15.1.1 面包屑 290
15.1.2 向上走 291
15.1.3 處理焦點(diǎn)處的樹(shù) 293
15.1.4 一路走到頂端,那里的空氣既新鮮又干凈 294
15.2 在列表上定位 294
15.3 一個(gè)非常簡(jiǎn)單的文件系統(tǒng) 295
15.3.1 為文件系統(tǒng)創(chuàng)建一個(gè)zipper 296
15.3.2 操作文件系統(tǒng) 298
15.4 小心行事 299
15.5 謝謝閱讀! 301"