新書推薦:

《
自我与本我:弗洛伊德经典心理学著作(精装典藏版)
》
售價:HK$
74.8

《
消费是什么 : 关于消费主义的社会学研究(一本书告诉你为什么买买买之后也有巨大空虚感)
》
售價:HK$
64.9

《
人类简史系列(白金纪念版)(套装共4册)
》
售價:HK$
347.6

《
深度学习推荐系统2.0
》
售價:HK$
140.8

《
小欢喜2:南京爱情故事
》
售價:HK$
75.9

《
分解工作法:聪明人如何解决复杂问题
》
售價:HK$
65.8

《
翡翠鉴赏(全彩珍藏版)
》
售價:HK$
75.9

《
艺文志·石川啄木:日本的第一个现代人
》
售價:HK$
74.8
|
編輯推薦: |
经过数十年的低调发展,函数式编程终于迎来了它的春天。它以简单明了、通俗易懂的代码支持异步、并发处理,使得函数式编程的一些精华逐渐融入到传统的面向对象语言之中,如C#语言和Java语言。《深入C#函数式编程》深入浅出,为广大C#程序员揭示了如何巧用函数式编程的特性,而这并不需要重新学习一门全新的语言。
C#语言和F#语言共享着同一个运行时环境,因此在C#语言中也能运用大部分F#的函数式特性。《深入C#函数式编程》详细阐述了如何在C#语言中快速编写函数式代码,无需额外安装依赖项或.NET3之后的任何新特性。《深入C#函数式编程》可以帮助读者深刻理解为何函数式编程的理念能够立竿见影地提升工作效率。
● 探究函数式编程的内涵及其起源;
● 通过熟悉的语言领略函数式范式的独特魅力;
● 立刻开始在C#中以函数式方式编写代码,摆脱对第三方库的依赖;
● 编写出更加稳定、更少出错、更易于测试的代码;
● 重新审视C#中那些非传统的结构方式;
● 深入探讨在业务环境中应用函数式C#的实用价值。
|
內容簡介: |
《深入C#函数式编程》阐述了函数式编程的历史背景、基本概念和实践,展示了如何借助于 C# 语言和函数式编程来增强代码的可读性和可维护性以及提高代码的质量。书中还探讨了 C# 语言中非传统结构的使用方法以及如何通过函数式编程重构现有的代码。此外,本书还通过丰富的案例分析了在实际业务场景中应用 C# 函数式编程能带来哪些实际的好处。
通过本书的阅读,广大 C# 程序员——无论是初学者还是有经验的开发者,都可以从中学到如何巧用函数式编程来显著提高工作效率和代码质量。
|
關於作者: |
西蒙·J.潘特(Simon J. Painter)拥有20年专业开发经验,对.NET各个版本在各个行业的应用非常熟悉。他活跃于.NET用户组和行业会议,以演讲嘉宾的方式与业内广大开发人员分享函数式编程和.NET常见开发话题。西蒙与他的妻子和孩子居住在英国。
微软MVP,自2005年以来,一直深耕于软件开发领域,使用过.NET的每一个版本。他在很多不同的行业中工作过。日常工作之余,他喜欢参加用户小组和会议,经常在会上发表函数式编程和.NET相关主题的演讲。小时候读懂父亲的Sinclair ZX Spectrum BASIC手册之后,西蒙就成了一名编程爱好者。除了编程,他还喜欢玩音乐、玩填字游戏、玩《战斗幻想》以及痛饮咖啡——虽然明知对健康没有什么好处。目前,他和妻子、女儿生活在英国的一个小镇上。
|
目錄:
|
● 第 1 章 绪论 1
● 第 I 部分 我们已经在做的事 27
● 第 2 章 我们目前能做些什么 29
● 第 3 章 C# 7.0 及后续版本的函数式编程 53
● 第 4 章 函数式代码:巧干胜过苦干 73
● 第 II 部分 深度学习函数式编程 93
● 第 5 章 高阶函数 95
● 第 6 章 可区分联合 123
● 第 7 章 函数式流程 145
● 第 8 章 柯里化和偏函数 177
● 第 9 章 不定循环 189
● 第 10 章 记忆化 207
● 第 III 部分 走出迷雾 215
● 第 11 章 实用函数式 C# 语言 217
● 第 12 章 NuGet 中的现有函数式编程库 239
● 第 13 章 火星之旅 253
● 第 14 章 结语 283
详细目录
第 1 章 绪论 1
1.1 函数式编程是什么 1
1.2 函数式编程的特性 3
1.2.1 不变性 3
1.2.2 高阶函数 3
1.2.3 首选表达式而非语句 5
1.2.4 基于表达式的编程 6
1.2.5 引用透明性 7
1.2.6 递归 9
1.2.7 真·递归 9
1.2.8 模式匹配 10
1.2.9 无状态 12
1.3 制作蛋糕 13
1.3.1 命令式蛋糕 13
1.3.2 声明式蛋糕 14
1.4 函数式编程的起源 15
1.5 还有别的人在用函数式编程吗 17
1.5.1 纯函数式语言 17
1.5.2 首先学习纯函数式语言是否值得 18
1.5.3 F# 怎么样?是否有必要学 19
1.5.4 多范式语言 20
1.6 函数式编程的好处 21
1.6.1 简洁 21
1.6.2 可测试性 22
1.6.3 健壮性 22
1.6.4 可预测性 22
1.6.5 更好地支持并发 23
1.6.6 降低代码噪音 24
1.7 函数式编程的最佳应用场景 24
1.8 更适合使用其他范式的场景 25
1.9 函数式编程能应用到何种程度 25
1.10 单子实际上,先不用担心这个 26
1.11 小结 26
第 I 部分 我们已经在做的事
第 2 章 我们目前能做些什么 29
2.1 开始 29
2.2 编写第一段函数式代码 30
2.2.1 非函数式的电影查询示例 30
2.2.2 函数式的电影查询示例 31
2.3 以结果为导向的编程 33
2.4 可枚举对象 34
2.5 首选表达式而非语句 38
2.5.1 低调的 Select 38
2.5.2 合而为一:聚合的艺术 42
2.5.3 自定义迭代行为 43
2.6 使代码不可变 46
2.7 完整的函数式流程 48
2.8 更进一步:提升函数式编程技能 51
2.9 小结 52
第 3 章 C# 7.0 及后续版本的函数式编程 53
3.1 元组 53
3.2 模式匹配 54
3.2.1 银行账户的过程式解决方案 54
3.2.2 C# 7.0 中的模式匹配 57
3.2.3 C# 8.0 中的模式匹配 58
3.2.4 C# 9.0 中的模式匹配 60
3.2.5 C# 10.0 中的模式匹配 60
3.2.6 C# 11.0 中的模式匹配 61
3.3 只读结构 62
3.4 Init-Only Setter 64
3.5 记录类型 65
3.6 可空引用类型 68
3.7 展望未来 70
3.7.1 可区分联合 70
3.7.2 活动模式 71
3.8 小结 72
第 4 章 函数式代码:巧干胜过苦干 73
4.1 是时候展现 Func 的魔力了 74
4.1.1 可枚举对象中的 Func 74
4.1.2 超级简单的验证器 75
4.1.3 C# 语言旧版本中的模式匹配 78
4.2 让字典更有用 82
4.3 对值进行解析 84
4.4 自定义枚举 86
4.4.1 查询相邻元素 86
4.4.2 在满足条件前持续迭代 89
4.5 小结 91
第 II 部分 深入学习函数式编程
第 5 章 高阶函数 95
5.1 问题报告 96
5.2 关于 thunk 99
5.3 链式调用函数 102
5.4 分叉组合子 104
5.5 Alt 组合子 106
5.6 组合 108
5.7 关于 Transduce 110
5.8 Tap 函数 112
5.9 try/catch 块 113
5.10 处理空值 118
5.11 更新可枚举对象 120
5.12 小结 122
第 6 章 可区分联合 123
6.1 假日时光 123
6.2 使用可辨识合联合的旅游团应用 125
6.3 薛定谔的联合 127
6.4 命名规范 128
6.5 数据库查询 131
6.6 发送电子邮件 133
6.7 控制台输入 134
6.8 泛型联合 138
6.9 Maybe 类型 138
6.10 Result 类型 139
6.11 对比 Maybe 和 Result 140
6.12 Either 类型 143
6.13 小结 144
第 7 章 函数式流程 145
7.1 再论 Maybe 类型 145
7.1.1 Maybe 类型和调试 150
7.1.2 对比 Map() 函数和 Bind() 函数 151
7.1.3 Maybe 类型和基元类型 152
7.1.4 Maybe 对象和日志记录 154
7.1.5 Maybe 对象和 Async 158
7.1.6 Maybe 对象的嵌套 159
7.2 定律 162
7.2.1 左恒等律 162
7.2.2 右恒等律 162
7.2.3 结合律 163
7.3 Reader 单子 164
7.4 State 单子 166
7.5 Maybe 单子与 State 单子 168
7.6 示例:你可能已经用过的单子 169
7.6.1 可枚举对象 169
7.6.2 Task 170
7.7 其他结构 171
7.8 工作示例 173
7.9 小结 175
第 8 章 柯里化和偏函数 177
8.1 柯里化和大型函数 178
8.2 柯里化和高阶函数 182
8.3 在 NET 中使用柯里化 183
8.4 偏函数 185
8.5 在 NET 中实现偏函数 186
8.6 小结 187
第 9 章 不定循环 189
9.1 递归 192
9.2 什么是 Trampolining 194
9.3 自定义迭代器 197
9.3.1 理解枚举器的结构 198
9.3.2 实现自定义枚举器 199
9.3.3 循环次数不定的可枚举对象 201
9.3.4 使用不定迭代器 204
9.4 小结 206
第 10 章 记忆化 207
10.1 贝肯数 207
10.2 在 C# 语言中实现记忆化 212
10.3 小结 214
第 III 部分 走出迷雾
第 11 章 实用函数式 C# 语言 217
11.1 函数式 C# 语言与性能 217
11.1.1 基线:命令式解决方案 219
11.1.2 性能结果 220
11.1.3 确定循环的解决方案 221
11.1.4 不定循环的解决方案 222
11.2 这一切意味着什么 229
11.3 对函数式 C# 语言的担忧和疑问 231
11.3.1 函数式代码应该在代码库中占多大比例 231
11.3.2 应该如何构建函数式 C# 语言解决方案 232
11.3.3 如何在不同应用程序之间共享函数式方法 232
11.3.4 这个披萨是你点的吗 233
11.3.5 如何说服团队成员也这么做 233
11.3.6 是否应该在解决方案中包含 F# 项目 235
11.3.7 函数式编程能解决所有问题吗 235
11.3.8 说到 007,你更喜欢康纳利、摩尔还是克雷格 236
11.3.9 如何以函数式思维解决问题 236
11.3.10 如果完全不能通过函数式编程风格的代码实现我想要的高性能,怎么办 237
11.4 小结 237
第 12 章 NuGet 中的现有函数式编程库 239
12.1 OneOf 库 240
12.2 LanguageExt 库 242
12.2.1 Option 243
12.2.2 Either 244
12.2.3 记忆化 245
12.2.4 Reader 246
12.2.5 State 246
12.2.6 LanguageExt 小结 247
12.3 Functional.Maybe 库 247
12.4 CsharpFunctionalExtensions 库 249
12.4.1 Maybe 单子 249
12.4.2 Result 250
12.4.3 Fluent Assertions 251
12.4.4 CSharpFunctionalExtensions 小结 251
12.5 F# 编程语言 252
12.6 小结 252
第 13 章 火星之旅 253
13.1 故事 253
13.2 技术细节 254
13.3 创建游戏 256
13.3.1 解决方案 256
13.3.2 通信 257
13.3.3 玩法说明 258
13.3.4 设置物品栏 259
13.3.5 游戏循环 267
13.4 小结 280
第 14 章 结语 283
14.1 读到这里,你的感受如何 283
14.2 接下来走向何方 284
14.2.1 更多的函数式 C# 语言 284
14.2.2 学习 F# 285
14.2.3 纯函数式编程语言 285
14.3 那我呢 286
|
內容試閱:
|
我经常参加开发者大会。从这些会议中,我观察到函数式编程(functional programming,FP)的讨论热度似乎一年高过一年。许多会议都有一个专门讨论函数式编程的分论坛,并且其他演讲中多少也会提到这个主题。
函数式编程的重要性正在稳步上升,这背后有哪些原因呢?
原因在于,函数式编程是软件开发史上最伟大的创新之一。它不仅很酷,还充满了乐趣。
随着容器化和无服务器应用等概念的兴起,函数式编程不再只是开发者的业余爱好,也不是那种几年后就被人遗忘的短暂热潮,而是成为一个能为利益相关者带来实质性好处的重要概念。
此外,在 .NET 生态系统中,函数式编程的推广还得益于一些关键因素。例如C# 语言的首席设计师马德斯·托格森,他是函数式编程的忠实拥趸,同时也是将函数式编程引入 .NET 的主要推动者之一。另外,作为 .NET 家族中的函数式编程语言,F# 语言的影响也不容忽视。F# 与 C# 共享同一个运行时环境,所以F# 团队开发的许多函数式特性往往也会以某种形式集成到 C# 语言中。
然而,一个重要的问题仍然存在:函数式编程究竟是什么?我是不是需要学习一门全新的编程语言才能使用它?好消息是,如果你是一名 .NET 开发者,那就不需要为了紧跟潮流而花费大量业余时间来学习新技术,也不需要引入新的第三方库来增加应用程序的依赖:有了开箱即用(out-of-the-box)的 C# 代码,即可实现函数式编程,为此,我们只需要做一些小小的调整。
本书介绍函数式编程的基本概念、展现其优势并说明如何在 C# 语言中实现它们—学习这些知识不仅能满足你的个人编程爱好,而且能为你的工作带来立竿见影的好处。具体有以下几个好处:
● 代码更加清晰、整洁且易于理解;
● 代码库更容易维护;
● 减少应用程序中未处理的异常,避免它们所带来的不可预测的后果;
● 能更轻松地为代码库编写自动化单元测试。
除此之外,还有其他很多的好处,此处不再赘述。
谁应该阅读本书
无论是专业开发人员、学生还是编程爱好者,只要已经掌握 C# 语言的基础知识,就适合阅读这本书。虽然不要求你达到专家水平,但最好熟悉 C# 语言的基础知识,并且至少能够独立编写简单的 C# 应用程序。
因为书中涵盖了一些更高级的 .NET 知识,所以在谈到这些知识时,我会对它们进行详细说明。
本书尤其针对以下几类读者提供了相应的内容:
● 如果你已经掌握 C# 语言的基础知识,但为了编写出更好、更健壮的代码而想通过学习更高级的技术来进一步实现自我提升,就可以从本书中找到实用的,有价值的内容;
● 如果你是 .NET 开发者,听说过函数式编程甚至对它有一定的了解,并且想知道如何在 C# 语言中采用这样的编码风格,就可以通过本书开启新的征程;
● 如果你是 F# 开发者,希望继续使用熟悉的函数式编程工具,就可以通过本书了解相关细节;
● 如果你是从其他支持函数式编程的语言(如 Java 语言)转向 .NET 平台的开发者,就可以发现这本书是一个宝贵的资源;
● 如果你是真心热爱编程的人,在办公室里写了一天代码回到家后还会出于兴趣写一写自己的应用,就可以发现本书相当适合你。
本书写作动机
我从小就对编程有浓厚的兴趣。小的时候,我家里有一台 ZX Spectrum,这是一款 Sinclair Research 在 20 世纪 80 年代初开发的家用电脑。熟悉 Commodore 64的人,或许觉得 ZX Spectrum 似曾相识,但相比之下,它更古老。ZX Spectrum只支持 15 种颜色和 256×192 的屏幕分辨率。(它有 8 种基本颜色,每种颜色都有一个亮色版本。不过,其中一个颜色是黑色,而它并不存在亮色版本。所以,总共是 15 种颜色。)我用的是有 48 kB 内存的高级型号,而我父亲用的是更老的 ZX81 型号,内存仅有 1 kB,键盘则是橡胶材质。它甚至无法显示彩色的游戏角色,只有屏幕上的色块,因此游戏中的人物角色会根据背景的颜色而改变颜色。总而言之,在当时,它们真的很酷!
最让人兴奋的是,它的操作系统实际上是一个文本编程界面。我需要输入代码来加载游戏(使用 LOAD ”” 命令从磁盘加载)。当时市面上有一些专门针对孩子的包含游戏代码的杂志和书籍,正是这些资料培育了我对计算机代码的热爱。
在此,我要特别向 Usborne Publishing 表示感谢!
在我大约 14 岁的时候,学校电脑上的一个就业指导程序建议我考虑软件开发作为职业。那时我才第一次意识到,这个不太正经的爱好原来可以转为谋生的手段!
大学毕业后,我决定找一份正式的工作,当时是我第一次接触 C# 语言。就这样,我顺理成章地设定了下一个目标:找到恰当的编写代码的方式。这听起来很简单,对吧?但老实说,在差不多 20 年之后,我在努力,还没有实现这个目标。
我个人编程生涯的关键转折来自在挪威召开的一次开发者大会。那次大会后,我终于理解了我所熟悉的函数式编程究竟是什么。函数式编程的代码非常优雅和简洁,而且容易理解,这是其他编程风格难以企及的。虽然和其他类型的编程风格一样,采用函数式编程仍然可能编写出结构欠佳的代码,但函数式编程给我带来了一种前所未有的体验,让我觉得自己终于找到了一种“恰当”的编程方式。希望你在阅读这本书后,不仅认同我这个观点,而且还会被这个充满无限可能的编程世界深深吸引。
本书导航
本书的结构如下。
● 第 1 章是绪论,介绍如何立即开始使用 C# 语言进行函数式编程,不需要我们导入任何新的 NuGet 包、使用第三方库或者对 C# 语言进行特殊处理。这一章的所有示例几乎都适用于 C# 3.0 及以后的版本。完成第 1 章的学习,你将迈出第一步,开始你的函数式编程之旅,这一章的所有代码都相对简单,是本书后续内容的基础。
● 第 I 部分“我们已经在做的事”(第 2 章到第 4 章),探讨如何将函数式编程的一些理念自然融入 C# 编程中,不需要进行任何根本性的改变。在这一部分中,许多代码示例都直接使用标准 C# 语言来实现。
如果你之前从未听说过函数式编程而想要循序渐进地入门,那么这部分将是很好的起点。打个比方,这就像是游泳前轻轻地将脚浸入水中,看自己是否对下水游泳感兴趣。
● 第 II 部分“深入函数式编程”(第 5 章到第 10 章),标志着进入“深水区”,要介绍一些“真正”的函数式编程概念。不过别担心,我会一一拆解这些概念,由浅入深地进行讲解。
● 第 III 部分“走出迷雾”(第 11 章到第 14 章),总结并巩固前面所学的知识,并介绍其他一些值得钻研的领域。
随意挑选自己最感兴趣的部分开始阅读。这本书不是小说,(但是,假如把这本书比作小说,那么我保证它会是一部谋杀悬疑小说,而且凶手肯定是管家!)请按照自己觉得最合适的顺序阅读。
排版约定
本书使用的排版约定如下。
粗体
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
Constant width( 等宽字体 )
表示程序代码和段落内的程序元素,如变量名、函数名、数据库、数据类型、环境变量、语句和关键字等。
这个图标代表一般性的补充说明。
这个图标代表警告或需要注意的事项。
使用代码示例
本书的补充材料(包括代码示例、练习等)可以参见 https://oreil.ly/functional?programming-with-csharp-code。
如果在使用代码示例时遇到技术问题或有其他疑问,请通过以下电子邮件地址联系我们:bookquestions@oreilly.com。
这本书旨在帮助你学习。一般来说,除非计划大量复制或使用书中的代码,否则可以随意在自己的程序和文档中应用本书提供的示例代码,无需事先征得我们的同意。举例来说,编写一个包含书中多个代码片段的程序不需要特别许可。
但是,若要出售或分发 O‘Reilly 书籍中的示例代码,则必须获得我们的正式许可。引用本书和书中的示例代码来回答问题不需要特别许可,但是,如果在你的产品文档中大量引用了本书的示例代码,就需要获得正式许可。
虽然不是强制性要求,但我们总是欢迎并感激任何对书籍归属的标注。书籍归属应包含书名、作者、出版社和 ISBN 号。例如:“Functional Programming with C# by Simon J. Painter (O’Reilly). Copyright 2023 Simon J. Painter, 978-1-492-09707-5.”。
如果认为自己使用代码示例的方式可能超出了合理使用范围或上述许可范围,请随时通过以下邮箱联系我们:permissions@oreilly.com。
O‘Reilly 在线学习平台(O’Reilly Online Learning)
近 40 年来,O‘Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly 的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及 O‘Reilly和 200 多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
致谢
首先要感谢凯瑟琳·多拉德。几年前,她在奥斯陆举办的一次挪威开发者大会(NDC)上发表了一场演讲,题为“C# 语言的函数式编程技巧”,那是我第一次真正接触函数式编程,它为我打开了一扇通往美丽新世界的大门(https://oreil.ly/nBpWu)。
在这段探索之旅中,对我而言,恩里科·布奥南诺也是一名重要的导师。通过阅读他的著作《C# 函数式编程:写出更优质的 C# 代码》,我理解了一些复杂的函数式概念的运作方式。如果你对我的这本书感兴趣,那么我强烈推荐你同时再读一读他的那本。
感谢阅读本书早期草稿并提供宝贵反馈的人,包括伊恩·拉塞尔、马修·弗莱彻、利亚姆·莱利、马克斯·迪特泽、史蒂夫·柯林斯、赫拉尔多·李斯、马特·伊兰、拉胡尔·纳特、西瓦·古迪瓦达、克里斯蒂安·霍斯达尔、马丁·福斯、戴夫·麦克洛、塞巴斯蒂安·罗宾斯、大卫·谢弗、彼得·德·坦德、马克·西曼、杰拉尔德·弗斯鲁斯、亚历克斯·怀尔德、瓦拉迪斯·诺瓦科维茨、莱克纳·莱因哈德、埃里克·卢卡斯、克里斯托弗·斯特拉滕、凯瑟琳·多拉德以及斯科特·瓦斯欣。在此向大家一并致谢!
还要特别感谢我的编辑吉尔·伦纳德。在过去一年,她对我的包容始终犹如海纳百川,感谢她的耐心。
|
|