函数式编程是一种通过组合纯函数来构建计算机程序元素和结构的方式,避免共享状态、可变数据和副作用,就像我们通常在数学中看到的那样。代码函数中的变量表示函数参数的值,它类似于数学函数。其思想是程序员定义包含表达式、定义和参数的函数,这些函数可以通过变量来表达以解决问题。 函数式编程是声明性的,而不是命令性的,这意味着编程是用表达式或声明而不是语句来完成的。函数式编程的应用状态流过纯函数,避免了副作用。与命令式编程相反,应用状态通常与对象中的方法共享和搭配。在命令式编程中,表达式被求值,结果值被赋给变量。例如,当我们将一系列表达式组合成一个函数时,结果值取决于变量在该时间点的状态。由于状态的不断变化,求值的顺序至关重要。在函数式编程中,破坏性赋值是被禁止的,每次赋值发生时,都会引入一个新的变量。最棒的是,函数式代码往往比命令式或面向对象的代码更简洁、更可预测、更容易测试。 虽然有一些专门为函数式编程设计的语言,比如 Haskell 和 Scala,但是我们也可以使用 C++ 来完成函数式编程的设计,这一点我们将在本书通篇讨论。
第 1 章、潜入现代 C++ ,概述现代 C++,包括现代 C++ 中几个新特性的实现,如 auto 关键字、decltype 关键字、null 指针、基于范围的 for 循环、标准模板库、Lambda 表达式、智能指针和元组。
第 2 章、在函数式编程中操纵函数,涵盖了函数式编程中操纵函数的基本技术;它们是一流的函数技巧、纯函数和 curry 技巧。通过应用第一类函数,我们可以将我们的函数视为数据,这意味着它可以被分配给任何变量,而不仅仅是作为函数调用。我们还将应用纯函数技术,这样函数就不会再产生副作用。此外,为了简化函数,我们可以应用 currying 技术,这将通过求值每个函数中具有单个参数的函数序列来减少多参数函数。
第 3 章、将不可变状态应用于函数,解释了我们如何为可变对象实现不可变对象。我们还将深入研究第一类函数和纯函数(我们在上一章中讨论过),以生成一个不可变的对象。
第 4 章、使用递归算法重复方法调用,讨论了迭代和递归的区别以及为什么递归技术更适合函数式编程。我们还将列举三种递归:函数递归、过程递归和回溯递归。
第 5 章、使用延迟求值来拖延执行过程,解释了如何延迟执行过程以获得更高效的代码。我们还将实现缓存和记忆技术,以使我们的代码运行得更快。
第六章、用元编程优化代码讲的是用元编程优化代码,用编译时执行运行代码。我们还将讨论如何将流控制重构为模板元编程。
第 7 章、使用并发运行并行执行,引导我们在 C++ 编程中运行多个线程,以及同步线程以避免死锁。我们还将在 Windows 操作系统中应用线程处理。
第 8 章、创建和调试函数式方法中的应用,阐述了我们在前面章节中讨论的设计函数式编程的所有技术。此外,如果出现意外结果或程序在执行过程中崩溃,我们将尝试调试代码以找到解决方案。
要浏览本书并成功编译所有源代码示例,您需要一台运行微软视窗 8.1(或更高版本)并包含以下软件的个人计算机:
- GCC 的最新版本,支持 C++ 11、C++ 14 和 C++ 17(在撰写本书期间,最新版本是 GCC v7.1.0)
- 微软 Visual Studio 2017 中提供的微软 C++ 编译器,用于支持 C++ 11、C++ 14 和 C++ 17(针对第 7 章、使用并发运行并行执行)
- 代码::Blocks v16.01(所有示例代码都是使用代码::Blocks IDE 编写的;但是,使用这个 IDE 是可选的)
这本书是为熟悉面向对象的 C++ 开发人员编写的,他们有兴趣学习如何应用功能范例来创建健壮且可测试的应用。
在这本书里,你会发现许多区分不同种类信息的文本样式。以下是这些风格的一些例子和对它们的意义的解释。
文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、伪 URL 和用户输入如下所示:“还可以将auto
关键字应用于函数,以自动推导函数的返回类型。”
代码块设置如下:
int add(int i, int j)
{
return i + j;
}
当我们希望将您的注意力吸引到代码块的特定部分时,相关的行或项目以粗体显示:
// Initializing a string variable
Name n = {"Frankie Kaur"};
cout << "Initial name = " << n.str;
cout << endl;
新名词和重要词语以粗体显示。
Warnings or important notes appear like this. Tips and tricks appear like this.
我们随时欢迎读者的反馈。让我们知道你对这本书的看法——你喜欢或不喜欢什么。读者反馈对我们来说很重要,因为它有助于我们开发出你真正能从中获益的标题。
要向我们发送一般反馈,只需发送电子邮件[email protected],并在您的邮件主题中提及书名。
如果你对某个主题有专业知识,并且对写作或投稿感兴趣,请参见我们位于www.packtpub.com/authors的作者指南。
现在,您已经自豪地拥有了一本书,我们有许多东西可以帮助您从购买中获得最大收益。
你可以从你在http://www.packtpub.com的账户下载这本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问http://www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。
您可以按照以下步骤下载代码文件:
- 使用您的电子邮件地址和密码登录或注册我们的网站。
- 将鼠标指针悬停在顶部的“支持”选项卡上。
- 点击代码下载和勘误表。
- 在搜索框中输入图书的名称。
- 选择要下载代码文件的书籍。
- 从您购买这本书的下拉菜单中选择。
- 点击代码下载。
下载文件后,请确保使用最新版本的解压缩文件夹:
- 视窗系统的 WinRAR / 7-Zip
- zipeg/izp/un ARX for MAC
- 适用于 Linux 的 7-Zip / PeaZip
这本书的代码包也托管在 GitHub 上的https://GitHub . com/packt publishing/learning cppffunctionalprograming。我们还有来自丰富的图书和视频目录的其他代码包,可在https://github.com/PacktPublishing/获得。看看他们!
我们还为您提供了一个 PDF 文件,其中包含本书中使用的截图/图表的彩色图像。彩色图像将帮助您更好地理解输出中的变化。您可以从https://www . packtpub . com/sites/default/files/downloads/learning cppffunctionalprogramming _ color images . pdf下载此文件。
尽管我们尽了最大努力来确保我们内容的准确性,但错误还是会发生。如果你在我们的某本书里发现一个错误,也许是文本或代码中的错误,如果你能向我们报告,我们将不胜感激。通过这样做,你可以让其他读者免受挫折,并帮助我们改进这本书的后续版本。如果您发现任何勘误表,请访问http://www.packtpub.com/submit-errata,选择您的书籍,点击勘误表提交表格链接,并输入您的勘误表的详细信息。一旦您的勘误表得到验证,您的提交将被接受,勘误表将上传到我们的网站或添加到该标题勘误表部分下的任何现有勘误表列表中。
要查看之前提交的勘误表,请前往https://www.packtpub.com/books/content/support并在搜索栏中输入图书名称。所需信息将出现在勘误表部分。
互联网上版权材料的盗版是所有媒体的一个持续问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上遇到任何形式的我们作品的非法拷贝,请立即向我们提供位置地址或网站名称,以便我们寻求补救。
请通过[email protected]联系我们,获取疑似盗版材料的链接。
我们感谢您在保护我们的作者方面的帮助,以及我们为您带来有价值内容的能力。
如果您对本书的任何方面有问题,可以联系我们[email protected],我们将尽最大努力解决问题。