内容推荐 函数式编程将改变你思考代码的方式!利用良好的FP技术,C#开发人员可极大地提升软件的并发处理、状态管理和事件处理能力,以及软件的可维护性。本书介绍了在C#编码实践中添加函数式编程的原因、方式和位置。 《C#函数式编程(第2版)》引导你在C#语言中使用函数式思想来解决实际问题。书中回顾了C#语言中一些能够用来实现函数式编程的语言特性,并且通过许多实际的例子展示了函数组合、数据驱动编程和不可变数据结构的强大功能。所有代码示例均可用于.NET6和C#10。 主要内容: 高阶函数减少了代码的重复,可用更少的代码执行更多的操作。 基于纯函数的代码易于测试和优化。 编写高质量的API,准确描述程序的行为。 编写函数式风格的Web API。 与LINQ的单组合。 作者简介 恩里科·博南诺(Enrico Buonanno),毕业于哥伦比亚大学计算机科学系,是一名出色的开发人员、架构师和培训师,拥有15年的工作经验。 目录 第Ⅰ部分 入门 第1章 介绍函数式编程 1.1 什么是函数式编程 1.1.1 函数作为第一类值 1.1.2 避免状态突变 1.1.3 编写具有强力保证的程序 1.2 C#语言中的函数式编程 1.2.1 LINQ的函数式性质 1.2.2 函数式编码的简短语法 1.2.3 元组的语言支持 1.2.4 模式匹配和记录类型 1.3 将在本书中学到什么 1.4 本章小结 第2章 函数思维 2.1 什么是函数 2.1.1 映射函数 2.1.2 在C#中表示函数 2.2 高阶函数 2.2.1 依赖其他函数的函数 2.2.2 适配器函数 2.2.3 创建其他函数的函数 2.3 使用HOF避免重复 2.4 练习 2.5 本章小结 第3章 函数纯洁性很重要 3.1 什么是函数的纯洁性 3.1.1 纯洁性和副作用 3.1.2 管理副作用的策略 3.2 通过避免状态突变实现并行化 3.2.1 纯函数可良好地并行化 3.2.2 并行化不纯函数 3.2.3 避免状态突变 3.3 纯洁性和可测性 3.3.1 隔离I/O影响 3.3.2 实践:一个业务验证场景 3.3.3 为什么很难测试不纯函数 3.4 执行I/O的测试代码 3.4.1 面向对象的依赖注入 3.4.2 可测试性没有那么多样板 3.5 纯洁性和计算的发展 3.6 练习 3.7 本章小结 第Ⅱ部分 核心技术 第4章 设计函数签名和类型 4.1 设计函数签名 4.1.1 使用箭头符号编写签名 4.1.2 签名的信息量有多大 4.2 使用数据对象捕获数据 4.2.1 原始类型通常不够具体 4.2.2 使用自定义类型约束输入 4.2.3 编写“诚实的”函数 4.2.4 把值组合到复杂的数据对象中 4.3 使用Unit为数据缺失建模 4.3.1 为什么void不理想 4.3.2 弥合Action和Func之间的差异 4.4 本章小结 第5章 为数据可能缺失建模 5.1 每天都在使用糟糕的API 5.2 Option类型的介绍 5.3 实现Option 5.3.1 Option的理想实现 5.3.2 使用Option 5.3.3 创建None 5.3.4 创建Some 5.3.5 优化Option实现 5.4 Option作为偏函数的自然结果类型 5.4.1 解析字符串 5.4.2 在集合中查找数据 5.4.3 智能构造函数模式 5.5 处理null 5.5.1 为什么null是一个糟糕的想法 5.5.2 使用Option替代null来获得健壮性 5.5.3 不可空的引用类型 5.5.4 防止NullReference-Exception 5.6 练习 5.7 本章小结 第6章 函数式编程中的模式 6.1 将函数应用于结构的内部值 6.1.1 将函数映射到序列上 6.1.2 将函数映射到Option 6.1.3 Option是如何提高抽象级别的 6.1.4 函子 6.2 使用ForEach执行副作用 6.3 使用Bind链接函数 6.3.1 将返回Option的函数组合起来 6.3.2 使用Bind平铺嵌套列表 6.3.3 实际上,这被称为单子 6.3.4 Return函数 6.3.5 函子和单子之间的关系 6.4 使用Where过滤值 6.5 使用Bind组合Option和IEnumerable 6.6 在不同抽象级别上编码 6.6.1 常规值与高级值 6.6.2 跨越抽象级别 6.6.3 重新审视Map与Bind 6.6.4 在正确的抽象级别上工作 6.7 练习 6.8 本章小结 第7章 使用函数组合设计程序 7.1 函数组合 7.1.1 复习函数组合 7.1.2 方法链 7.1.3 高级界域中的组合 7.2 从数据流的角度进行思考 7.2.1 使用LINQ的可组合API 7.2.2 编写可组合性更好的函数 7.3 工作流编程 7.3.1 关于验证的一个简单工作流 7.3.2 以数据流的思想进行重构 7.3.3 组合带来了更大的灵活性 7.4 介绍函数式领域建模 7.5 端到端的服务器端工作流 7.5.1 表达式与语句 7.5.2 声明式与命令式 7.5.3 函数式分层 7.6 练习 7.7 本章小结 第Ⅲ部分 函数式设计 第8章 函数式错误处理 8.1 表示输出的更安全方式 8.1.1 使用Either捕获错误细节 8.1.2 处理Either的核心函数 8.1.3 比较Option和Either 8.2 链接操作可能失败 8.3 验证:Either的一个完美用例 8.3.1 为错误选择合适的表示法 8.3.2 定义一个基于Either的API 8.3.3 添加验证逻辑 8.4 将输出提供给客户端应用程序 8.4.1 公开一个类似Option的接口 8.4.2 公开一个类似Either的接口 8.4.3 返回一个DTO结果 8.5 Either的变体 8.5.1 在不同的错误表示之间进行更改 8.5.2 Either的特定版本 |