第Ⅰ部分 学习函数式思维方式 3
第1章 不同的思维方式 3
1.1 什么是函数式编程 4
1.2 通向现实世界函数式编程的途径 6
1.2.1 函数式语言 6
1.2.2 .NET平台上的函数式编程 7
1.3 用函数式编程提高生产效率 7
1.3.1 函数式范例 8
1.3.2 声明性编程风格 8
1.3.3 理解程序所做的工作 10
1.3.4 并发友好的应用编程 11
1.3.5 函数式风格如何塑造代码 11
1.4 函数式编程举例 13
1.4.1 使用声明性风格表明目的 13
1.4.2 理解使用不可变性的代码 18
1.4.3 编写高效的并行程序 21
1.5 介绍F# 23
1.5.1 F#中的Hello world程序 24
1.5.2 从简单到现实世界 25
1.6 小结 29
第2章 函数式编程的核心概念 30
2.1 函数式编程的基础 31
2.2 函数式程序的求值 33
2.2.1 处理不可变值 33
2.2.2 使用不可变数据结构 35
2.2.3 使用递归改变程序状态 36
2.2.4 使用表达式而不是语句 37
2.2.5 计算式运算 38
2.3 编写声明性代码 41
2.3.1 以函数为值 41
2.3.2 高阶函数 43
2.4 函数式类型和值 46
2.4.1 C#和F#中的类型推断 47
2.4.2 可区分联合类型简介 49
2.4.3 模式匹配 50
2.4.4 编译时程序检查 53
2.5 小结 55
第3章 F#和C#中的元组、列表与函数 56
3.1 值和函数声明 57
3.1.1 值声明与作用域 57
3.1.2 函数声明 59
3.1.3 声明可变值 61
3.2 使用不可变数据结构 62
3.2.1 元组类型介绍 62
3.2.2 在C#中实现元组类型 65
3.2.3 用元组进行计算 67
3.2.4 对元组使用模式匹配 68
3.3 列表和递归 70
3.3.1 递归计算 71
3.3.2 函数式列表简介 72
3.3.3 C#中的函数式列表 76
3.3.4 函数式列表处理 77
3.4 将函数用作值 79
3.4.1 处理数值列表 80
3.4.2 参数化函数的好处 83
3.5 小结 84
第4章 F#与.NET库应用实例 85
4.1 用F#绘制饼图 85
4.2 在FSI中编写和测试代码 87
4.2.1 加载和解析数据 87
4.2.2 用数据进行计算 90
4.3 创建一个控制台应用程序 93
4.4 创建一个Windows Forms应用程序 96
4.4.1 创建用户界面 97
4.4.2 绘制图片 100
4.4.3 创建Windows应用程序 106
4.5 小结 8
第Ⅱ部分 基本函数式技巧 111
第5章 在局部使用函数式值 111
5.1 值是什么 112
5.1.1 基元类型、值类型和对象 112
5.1.2 识别值和数据 112
5.2 多个值 113
5.2.1 F#和C#中的多个值 113
5.2.2 元组类型和值构造器 115
5.2.3 以组合方式使用元组 117
5.3 备选值 118
5.3.1 F#中的可区分联合 120
5.3.2 处理备选内容 121
5.3.3 添加类型还是函数 123
5.3.4 使用F#中的option类型 125
5.4 泛型值 127
5.4.1 在C#中实现option类型 128
5.4.2 F#中的泛型option类型 131
5.4.3 对值的类型推断 133
5.4.4 编写泛型函数 135
5.5 函数性值 136
5.5.1 lambda函数 139
5.5.2 函数类型 142
5.5.3 多参数函数 144
5.6 小结 148
第6章 使用高阶函数处理值 149
6.1 泛型高阶函数 150
6.1.1 用F#语言编写泛型函数 151
6.1.2 自定义运算符 151
6.2 处理元组 154
6.2.1 使用函数处理元组 155
6.2.2 C#中处理元组的方法 157
6.3 处理日程安排 158
6.3.1 日程安排列表的处理 160
6.3.2 用C#处理日程安排 161
6.4 处理option类型 162
6.4.1 使用map函数 163
6.4.2 使用bind函数 163
6.4.3 逐步对示例输入求值 165
6.4.4 为option类型实现操作 167
6.5 处理函数 168
6.5.1 函数组合 169
6.5.2 C#中的函数组合 171
6.6 类型推断 172
6.6.1 F#中对函数调用的类型推断 173
6.6.2 自动泛化 173
6.7 处理列表 175
6.7.1 在F#中实现列表 175
6.7.2 理解列表函数的签名 176
6.7.3 实现列表函数 180
6.8 公用处理语言 183
6.8.1 映射、筛选和折叠 183
6.8.2 对列表的bind操作 185
6.9 小结 186
第7章 设计以数据为中心的程序 187
7.1 函数式数据结构 188
7.1.1 使用F#记录类型 189
7.1.2 C#中的函数式数据结构 191
7.2 平面文档表示法 192
7.2.1 绘制元素 194
7.2.2 在窗体上显示绘制的内容 195
7.3 结构化文档表示法 198
7.3.1 转换表示法 199
7.3.2 XML文档表示法 202
7.4 编写操作 206
7.4.1 使用map操作进行更新 206
7.4.2 使用聚合操作进行计算 209
7.5 面向对象式表示法 211
7.5.1 用结构型模式表示数据 211
7.5.2 使用访问者模式添加函数 214
7.6 小结 216
第8章 设计以行为为中心的程序 217
8.1 使用行为集合 218
8.1.1 将行为表示为对象 218
8.1.2 在C#中将行为表示为函数 219
8.1.3 在C#中使用函数集合 221
8.1.4 在F#中使用函数列表 222
8.2 用于处理函数的术语 224
8.2.1 策略设计模式 224
8.2.2 命令设计模式 225
8.2.3 在F#中使用闭包来采集状态 228
8.3 处理组合行为 233
8.3.1 函数的记录 233
8.3.2 构造组合行为 235
8.3.3 F#代码的进一步演进 236
8.4 结合数据与行为 238
8.4.1 决策树 238
8.4.2 F#中的决策树 239
8.4.3 C#中的决策树 242
8.5 小结 245
第Ⅲ部分 高级F#编程技术 249
第9章 将值转换为带有成员的F#对象类型 249
9.1 改进以数据为中心的应用程序 249
9.1.1 向F#类型添加成员 251
9.1.2 使用类型扩展追加成员 254
9.2 改进以数据为中心的应用程序 256
9.2.1 使用函数记录 257
9.2.2 使用接口对象类型 258
9.3 处理.NET接口 260
9.3.1 使用.NET集合 260
9.3.2 使用IDisposable清除资源 262
9.4 具体对象类型 265
9.4.1 函数式类和命令式类 267
9.4.2 实现接口和转换 269
9.5 从C#中使用F#车 273
9.5.1 处理记录和成员 274
9.5.2 处理值和委托 276
9.6 小结 278
第10章 数据结构的效率 279
10.1 优化函数 279
10.1.1 用尾递归避免堆栈溢出 280
10.1.2 使用记忆化缓存结果 285
10.2 处理大型集合 291
10.2.1 再次用尾递归避免堆栈溢出 291
10.2.2 高效地处理列表 294
10.2.3 处理数组 296
10.3 “延续”简介 301
10.3.1 树处理的困难所在 301
10.3.2 使用“延续”编写代码 303
10.4 小结 306
第11章 函数式程序的重构与测试 307
11.1 重构函数式程序 308
11.1.1 重复使用公共代码块 308
11.1.2 跟踪相关性和副作用 311
11.2 测试函数式代码 314
11.2.1 从交互式外壳程序到单元测试 315
11.2.2 编写利用结构等同性的测试 319
11.2.3 测试组合功能 322
11.3 重构计算顺序 323
11.3.1 不同的计算策略 324
11.3.2 计算策略对比 325
11.3.3 使用函数来模拟延迟计算 326
11.3.4 F#中的延迟值 328
11.3.5 为C#实现延迟值 330
11.4 在实践中使用延迟值 332
11.4.1 无限列表 332
11.4.2 缓存图片浏览器中的值 335
11.5 小结 338
第12章 序列表达式和备选工作流 339
12.1 生成序列 340
12.1.1 使用高阶函数 340
12.1.2 使用C#中的迭代器 341
12.1.3 使用F#序列表达式 342
12.2 掌握序列表达式 345
12.2.1 递归序列表达式 345
12.2.2 使用无限序列 347
12.3 处理序列 352
12.3.1 用迭代器转换序列 352
12.3.2 筛选与投影 353
12.3.3 平展投影 356
12.4 介绍备选工作流 361
12.4.1 自定义查询表达式 361
12.4.2 自定义F#语法 363
12.5 自定义计算中的第一步 365
12.5.1 声明计算类型 365
12.5.2 编写计算 366
12.5.3 在F#中实现一个计算构造器 367
12.5.4 在C#中实现查询运算符 369
12.6 为选项实现计算表达式 371
12.7 用记录来补充计算 373
12.7.1 创建记录计算 374
12.7.2 创建记录计算 375
12.7.3 使用计算表达式进行重构 377
12.8 小结 378
第Ⅳ部分 应用函数式编程 381
第13章 异步与数据驱动编程 381
13.1 异步工作流 382
13.1.1 异步工作流为什么重要 382
13.1.2 异步下载网页 383
13.1.3 理解工作流的工作原理 387
13.1.4 创建基元工作流 389
13.2 连接到世界银行 391
13.2.1 访问世界银行的数据 391
13.2.2 从失败中恢复 393
13.3 浏览和获取数据 395
13.3.1 实出XML helper函数 395
13.3.2 提取区域代码 397
13.3.3 获取指标 399
13.4 从数据中收集信息 402
13.4.1 读取值 402
13.4.2 使用度量单位设置数据格式 403
13.4.3 收集有关地区的统计数字 407
13.5 使用Excel实现数据可视化 408
13.5.1 将数据写入Excel 409
13.5.2 在Excel图表中显示数据 411
13.6 小结 413
第14章 编写并行函数式程序 414
14.1 理解不同的并行技术 415
14.1.1 并行处理命令式代码的孤岛 415
14.1.2 声明性数据并行 417
14.1.3 基于任务的并行机制 421
14.2 并行运行图形效果 426
14.2.1 在F#中计算颜色 426
14.2.2 实现和运行颜色滤镜 428
14.2.3 设计主应用程序 431
14.2.4 创建和运行效果 433
14.2.5 实现应用程序的并行化 437
14.2.6 实现模糊效果 439
14.3 创建并行模拟 441
14.3.1 表示模拟世界 442
14.3.2 设计模拟操作 444
14.3.3 实现helper函数 447
14.3.4 实现智能动物与捕食者 449
14.3.5 并行运行模拟 451
14.4 小结 453
第15章 创建可组合函数库 455
15.1 可组合设计方法 456
15.1.1 由符号组合动画 456
15.1.2 为符号赋予含义 457
15.1.3 组合值 458
15.1.4 组合函数和对象 459
15.2 创建动画值 463
15.2.1 函数式动画简介 463
15.2.2 行为简介 464
15.2.3 在C#中创建简单行为 466
15.2.4 在F#中创建简单行为 468
15.3 编写处理行为的计算 469
15.3.1 读取值 470
15.3.2 向行为应用函数 471
15.3.3 将函数转换为“行为函数” 472
15.3.4 在C#中实现提升和map 474
15.4 处理图画 477
15.4.1 表示图画 477
15.4.2 创建和组合图画 479
15.5 创建动画 483
15.5.1 在F#中实现动画窗体 483
15.5.2 使用行为创建动画 486
15.5.3 添加动画基元 488
15.5.4 创建一个太阳系动画 490
15.6 开发经济建模语言 493
15.6.1 经济合同建模 493
15.6.2 定义基元 494
15.6.3 使用建模语言 496
15.7 小结 498
第16章 开发函数式反应程序 499
16.1 使用事件的反应式编程 500
16.1.1 事件函数简介 501
16.1.2 使用事件和可观察对象 502
16.1.3 创建一个简单的反应式应用程序 505
16.1.4 使用LINQ进行声明性事件处理 507
16.1.5 在F#中声明事件 509
16.2 创建反应式动画 511
16.2.1 使用switch函数 511
16.2.2 实现switch函数 513
16.3 使用工作流进行UI编程 514
16.3.1 异步等待事件 514
16.3.2 绘制矩形 517
16.4 在反应式应用程序中存储状态 521
16.4.1 安全地处理状态 521
16.4.2 创建邮箱处理器 521
16.4.3 使用消息进行通信 524
16.4.4 封装邮箱处理器 528
16.4.5 等待多个事件 529
16.5 消息传送并发性 531
16.5.1 创建状态机处理器 532
16.5.2 并发访问邮箱 534
16.6 小结 535
附录 展望 537
快速参考 函数式编程概念 540
快速参考 F#语言构造 542
资源 544