译 者 简 介
郭涛主要从事人工智能、现代软件工程、智能空间信息处理与时空大数据挖掘分析等前沿领域的研究。翻译了多部计算机书籍,包括《函数式与并发编程》《Effective数据科学基础设施》和《重构的时机和方法》。
译 者 序
早在20世纪50年代,美国计算机科学家约翰•麦卡锡(John McCarthy)为IBM 700/7000系列机器发明了第一门函数式编程语言Lisp。Lisp最初创建时受到阿隆佐•邱奇的lambda演算的影响,在处理数学和逻辑运算方面具有高度的灵活性。因为是早期的高端编程语言之一,它很快成为人工智能研究中最受欢迎的编程语言。作为第一门函数式编程语言,Lisp开创了很多先驱概念。经过几十年的发展,形成了你所看到的现代函数式编程语言,函数式编程是一种编程风格,脱离特定的语言特性,函数式代码易于测试、复用。
与命令式编程相比,函数式编程将计算过程抽象为表达式求值。其中表达式由纯数学函数构成,这些数学函数是第一类对象且无副作用。因此,函数式编程很容易做到线程安全,且具有并发编程的优势。
目前,C++、Scala、Java、C#、Python等高级编程语言也设计了函数式编程语言特性。但函数式编程语言设计思想抽象,特性比较多,这给很多读者带来了很大的困扰,尤其是涉及并发的编程,已成为很多人的梦魇。《函数式编程图解》以图解方式,以Scala和Java语言作为实现载体,通过大量的代码示例和案例呈现出了函数式编程语言的特性。本书内容比较基础,建议读完本书的读者阅读译者翻译的另一本著作——《函数式与并发编程》(Functional and Concurrent Programming),该书与本书一脉相承,都以Scala和Java作为示例,主要围绕函数式编程和并发编程高级特性展开讲解。《函数式编程图解》适合计算机科学与工程、软件工程、人工智能专业的高年级本科生和企业中对函数式编程感兴趣的工程师阅读。
感谢吉林大学外国语学院研究生吴禹林、电子科技大学外国语学院高丹丹参与本书的翻译、审核和校对工作。由于函数式编程主题涉及的特性广泛且术语众多,国内学者对该主题的翻译常常不一致,为了确保本书的术语一致性,本书的用语参照了以下出版物:张骏温翻译的《C#函数式编程(第2版)》、程继洪等翻译的《C++函数式编程》、王宏江等翻译的《Scala函数式编程》。此外,我要感谢清华大学出版社的编辑、校对和排版工作人员,感谢他们为了保证本书质量所做的一切。
由于本书涉及内容广泛、深刻,加上译者翻译水平有限,本书难免存在不足之处,恳请各位读者不吝指正。
前 言
你好!感谢购买《函数式编程图解》。过去十年,我一直在与程序员讨论编程方法、其可维护性以及函数式编程概念逐渐被主流语言所采用这一趋势。许多专业开发人员表示,目前仍然很难从现有资源中学习函数式概念,因为这些资源要么过于简单,要么过于复杂。这就是本书试图填补的空白。本书旨在为那些想要全面了解基本函数式编程概念的程序员提供一种循序渐进的实用指南。
实践出真知,这就是本书大量使用实例的原因。读完这本入门书后,你将能够使用函数式方案编写功能齐全的程序,并轻松深入研究其理论基础。
如果你曾使用命令式面向对象语言(如Java或Ruby)创建重要的应用程序,那么你将从本书中获益匪浅。如果你所在的团队曾应对大量错误和可维护性问题,那么本书将是你的一大助力,因为这正是函数式编程的用武之地。
希望你喜欢阅读本书并完成习题,最好能像我写作时一样享受。再次感谢你对本书的喜爱!
——Michał Płachta
致 谢
首先,我要感谢 Scala 社区对工具和技术的不懈追求,这些工具和技术有助于构建可维护的软件。本书中介绍的所有想法都源自无数次的代码审查、讨论、多篇涉及大量回复的博客文章、即兴演示和生产故障事后分析。感谢你们的热情。
我要感谢我的家人,尤其是妻子Marta,她在写作过程中给予我大量的鼓励和爱。感谢可爱的孩子 Wojtek 和 Ola,他们确保我不会长时间坐在计算机前。
本书凝聚了许多人的心血。我要感谢 Manning 的工作人员:策划编辑Michael Stephens、编辑Bert Bates、开发编辑Jenny Stout、技术开发编辑Josh White、文稿编辑Christian Berk、出版编辑Keri Hales、技术审校Ubaldo Pescatore、校对Katie Tennant,以及所有参与本书出版的幕后人员。
感谢所有审稿人:Ahmad Nazir Raja、Andrew Collier、Anjan Bacchu、Charles Daniels、Chris Kottmyer、Flavio Diez、Geoffrey Bonser、Gianluigi Spagnuolo、Gustavo Filipe Ramos Gomes、James Nyika、James Watson、Janeen Johnson、Jeff Lim、Jocelyn Lecomte、John Griffin、Josh Cohen、Kerry Koitzsch、Marc Clifton、Mike Ted、Nikolaos Vogiatzis、Paul Brown、Ryan B. Harvey、Sander Rossel、Scott King、Srihari Sridharan、Taylor Dolezal、Tyler Kowallis 和 William Wheeler。感谢你们,你们的建议让这本书变得更完美。
关于本书
本书目标读者
《函数式编程图解》假设读者曾使用主流面向对象编程语言(如Java)且至少有一年的商业软件开发经验。本书中的示例将Scala用作教学语言,但本书并不是关于Scala的书。读者不需要事先了解Scala或函数式编程。
本书结构:阅读指南
本书分为三部分。第Ⅰ部分奠定基础,将探讨函数式编程(functional programming,FP)中通用的工具和技术。第1章将讨论如何使用本书学习FP。第2章将展示纯函数和非纯函数之间的区别。第3章将介绍不可变值。最后,第4章将说明纯函数只是不可变值,并展示其强大作用。
在本书的第Ⅱ部分,只使用不可变值和纯函数解决实际问题。第5章将介绍FP中最重要的函数,并展示如何以简洁和易读的方式构建顺序值和程序。在第6章,将学习如何构建可能返回错误的顺序程序。在第7章,将学习有关函数式软件设计的知识。第8章将教你如何以安全和函数式的方案处理非纯、外部、有副作用的问题。然后,第9章将介绍流和流式系统。我们将使用函数式方案构建数十万个项的流。在第10章,最终将创建一些函数式、安全的并发程序。
在第Ⅲ部分,将维基数据用作数据源以实现一个真实的函数式应用程序。将借此回顾前面两部分中学到的所有内容。在第11章,需要创建一个基于不可变值的数据模型,并使用含IO在内的正确类型,与维基数据集成,并使用缓存和多线程提高应用程序的速度。将把所有这些问题都封装在纯函数中,并展示如何在函数式世界中重用面向对象的设计。第12章将展示如何测试在第11章中开发的应用程序,你将看到,即使需求大幅变化,应用程序也易于维护。
最后,将以一组练习作为本书的结尾,以确保你掌握了函数式编程。
关于代码
本书包含许多源代码示例,源代码都以等宽字体格式化,以将其与普通文本区分开来。有时代码也会用粗体表示,以突出显示与同一章中的前几步相比发生变化的代码,例如当新功能添加到现有代码行时,新增的代码将以粗体显示。
许多情况下,原始源代码已被重新格式化;我们添加了换行符并重新调整了缩进,以使代码适应书中可用的页面空间。许多代码清单附带注释,以强调重要概念。
你可以扫描本书封底的二维码以获取可执行的代码片段,以及本书完整的示例代码。
此外,本书所有扩展资源(包括附录和附加材料)均可通过扫描封底二维码获得。
作 者 简 介
Michał Płachta是一位经验丰富的软件工程师,也活跃于函数式编程社区。他经常在技术会议上发言,主持研讨会,组织聚会,并在博客上发表文章,探讨如何创建可维护的软件。