关于本书
假设你已经开发过 .NET 程序,熟悉面向对象技术。想知道“函数式编程”有什么新内容,以及我们怎样能从中受益,那么,本书肯定适合你。
本书特别适合已经有面向对象编程和 C# 2.0 知识的开发者。当然,通常并不要求你有函数编程的知识。更不要求知道 F#。
其实,假设你过去经常使用面向对象方式思考问题,那么,学习函数式编程会更困难,由于很多函数式思想对你来说是陌生的。
我们写这本书已经在思想上有所考虑,一般会注意你的直觉。并比較面向对象与函数式编程。来解释特定的主题。
假设你已经使用过其它面向对象的语言和工具(比方,Java、Python 或 Ruby),有能力高速了解语言的话,也能从本书中受益。我们使用了 C# 的演示样例,当中的大部分与其它面向对象的语言相似,在其它语言中没有的、C# 3.0 中的新功能仅仅做简介,因此,你也不必操心。
本书并不关注函数式编程的学术方面,可是,假设你是计算机学科的学生。学过这方面的课程。那么,能够通过阅读本书学习有关有用的函数式概念。
书中有的:
假设你还是想知道本书究竟是否适合,那么就看看以下的内容:
函数式编程概念。
当你通读全书后。将学会一种全新的思维方式。
我们会发现,复杂的、面向对象的设计模式,在函数式编程中会变成一个简单的概念;函数式思维能够用在不论什么语言的编程中,因此。无论你使用的是哪一种语言,这都是实用的。
实际的基本函数式结构。
在 C# 3.0 中有一些结构,因此,你会发现很多熟悉的 C# 代码已经与简洁的函数式 F# 实现很接近了。
我们还将解释 C# 3.0 中的新功能,以及与函数式概念的关系。深入理解这些概念将有助于从新功能中受益。
写有用的 F# 代码。尽管本书并非有关 F# 的。但还是要教会你入门所须要的一切。我们将介绍 F# 的闪光点。包含异步编程和可组合库。
我们并不指望本书能完美的适合全部目的:计算不是个一刀切的领域。
那么,还是应该知道本书中所没有的。以避免失望。
书中没有的:
本书不是一本參考书。因此,假设你没有接触过函数式编程。那么,最好方法是从头開始,并按章节的顺序阅读本书。由于这是我们假设的阅读方法,后面的章节会引用前面介绍过的概念,而假设你从书的中间開始阅读,会发现难以理解。
本书也不是 F# 编程的简明手冊。
要想成为一个好的 F# 程序猿,唯一的方法是理解函数式编程的思想,你可能学习到全部的 F# 字,并用 F# 重写 C# 代码。但这样做并不好。假设想写出符合习惯的 F# 代码,必须学习不同的思维方法才干进行函数式编程,就也正是你阅读的目的。学会了以函数式风格进行思考以后。能够从其它书籍中更深入地学习F#。
我们写书的主要目的是让专业的程序猿解决实际问题的。然而,这并不意谓关我们为你提供一个可以随时使用的解决方式,可以立马解决你的专门问题;相反,我们很多其它地关注相关的概念和技术。
我们用了很多演示样例来解释这些原理。但也不可能覆盖到 F# 和函数式编程能应用到的全部领域。
路线图
本书使用了叠合结构(iterative structure)。
在第一部分(第一章到第四章),我们将解释一些最重要的主题,可以了解本书的目的。以及函数编程的区别所在;第二部分(第五章到第八章),系统地讨论全部函数式编程的基础;第三部分(第九章到第十二章),我们将构建这些基础,并讨论函数式编程、优化的最好实践,以及大多数函数式编程员须要常常使用的高级技巧;第四部分(第十三章到第十六章),介绍更复杂的演示样例,展示怎样用函数式编程开发大型的有用项目。
第一章,讨论函数式编程为什么变得越来越重要,给出的演示样例使用的是你可能已经知道的技术,它得益于函数式编程的某些方面。还展示了第一个用 F# 写的应用程序。
第二章。介绍函数式编程后面的概念,并不展示不论什么细节,且大部分使用 C#,这将有助于你理解这些概念是怎样彼此相关的,以及程序结构的意思。
第三章,最后展示一些实际的函数式代码,演示 F# 中使用的数据类型,比方元级(tuple)和列表(list)。
我们将会看到怎样在 F# 使用这些类型,还将用 C# 实际这些类型。以解释其原理。这一章会介绍函数就是值的概念,这是函数式编程的核心。
第四章,展示第一个用 F# 实现的有用程序,我们将使用各种 .NET 和 F# 库来实现一个绘制饼图程序;还将看到怎样在开发过程中高效地使用 F# 提供的工具。
第五章。讨论值。函数式程序通常写成计算形式,取值作为參数。返回值作为结果,因此,我们必须从系统地了解函数式功能開始,讨论各种类型的值。
第六章,讨论使用值的最常见方法,即使用高阶函数(higher-order function)。直接使用值。通常须要大量反复的代码。因此。这一章将展示怎样设计并实现可重用的运算。
第七章,把注意力转向体系方面,函数式程序的结构是由它处理的数据决定的。我们用来演示这个重要原理的是一个操作和绘制简单文档的应用。
第八章,将关注应用程序的体系结构,可以在执行时动态改变其行为。这可以通过使用函数实现,由于,我们会具体讨论。同一时候将解释相关主题,比方闭包(closure)。
第九章。展示怎样在 F# 中面向对象与函数式风格,将演示配合使用函数式功能,比方不可变性,与面向对象的概念,比方封装(encapsulation),写出函数式的 .NET 库。
第十章,将关注正确性与效率。我们将看到怎样写出可以处理随意大小的数据集,以及怎样写出高效的函数。还将学习怎样使用命令式结构,比方数组(array)来优化代码。
第十一章,讨论重构(refactoring)、測试和延迟处理(laziness)。我们将解释函数式编程怎样使理解与改进现有代码变得更加easy;还将讨论单元測试,能够看到因为有了可组合性(composability)和严谨性(strictness)。有些类型測试能够不必要。
第十二章,首选展示怎样处理数据集合,将介绍 F# 的序列表达式(sequence expression),它是专为这个目的的;我们还将看到这不是内置的功能。与 C# 中的最相似的功能不一样,它更常见的是可以改变代码意思的能力。
第十三章。这是一个在 F# 中处理数据的最常见场景。首选使用公开的站点服务(web service)下载数据,然后,解析成结构化的格式。最后。用 Excel 对感兴起的部分进行可视化。
第十四章,展示通过使用函数式概念。可以方便地构建并行化(parallelize)的应用程序。用一个图像处理程序,以及模拟动物和捕食者猎杀动物进行演示,
第十五章,介绍怎样构建式函数库(declarative functional library)。
设计良好的库可以非常优美地组合,比方。创建产生动画的库,和表示金融合约(financial contract)的库。
第十六章。展示怎样构建图形界面应用,更一般的,由外部事件驱动的程序。实现像这种控制流。在其它语言中是相当困难的,因此,我们要看一下 F# 是怎样使之更easy的。
印刷约定
本书中包括了大量的演示样例代码,使用了定宽字体排版。更长的演示样例放在有标题的清单中。因为本书混合了 C# 和 F#,在并排的清单中。标题还表示了使用的语言。当展示 F# 代码时,我们区分两种形式的清单,标记为“F#”的代码是真正的源码,一般来说可以编译;而标记为“F# Interactive”的清单,是在 F# 交互环境中输入的代码段,其输出用斜体排版。加粗的定宽字体用于强调 C# 和 F# 清单中的keyword。
命名约定
在本书中。我们不仅混合了两种语言。还混合了函数式编程与面向对象两种风格。我们想使用两种语言的自然风格,因此。对于 F# 和 C# 必须遵循不同的约定。
在 C# 中,遵循通常的 .NET 风格;在 F# 中。假设开发的类和组件须要从其它 .NET 语言訪问时。毫无例外,也使用这样的记号;可是,假设 F# 仅仅是私有的实现。我们就遵循函数式命名风格。
最明显的,对变量和函数名,我们都使用了驼峰命名法(camelCase),这在 F# 中是最经常使用的风格。由于,函数声明与变量声明在本质上是一回事。
偶尔,我们也会使用更短的名字和缩写,这有两个原因:第一。函数式程序猿常常使用这样的风格。因为在了更好的常常开发环境,差点儿再无理由使用这样的风格了。因此,我们也尽量少用。可是,有些情况下,短名字在函数式编程已经约定俗成。我们也保留。第二,有时,我们并排两个演示样例。这样,我们必须尽量用更简单的代码风格;否则,除了文中讨论的少数例外,其它大部分都符合 .NET 风格。
StyleCop 和 FxCop
假设你熟悉代码分析工具,比方StyleCop 和 FxCop。那么,你可能想知道,本书中的代码是否符合这些工具所要求的规则。
我们说大部分符合通常的 .NET 规则,但不是所有,假设你用这些工具执行代码。会有大量的警告,主要有两个原因:
第一,代码分析工具是为面向对象语言开发的,使用的命名与风格都是面向对象的规则。像你将在本书中所学习的。函数式编程在很多方面是不同的。因此。不会简单地遵循全部面向对象的规则。F# 语言之所以成功。是由于它全然不同于 C# 和Visual Basic。
它不仅表现看得风的的语言keyword上。而很多其它的是在编程风格上,在某些方面。命名规则也使代码更简洁。
第二,受本书篇幅的限制。我们使用的源码演示样例仅仅演示重要的概念,但对于讨论来说并不重要,它会要求代码遵循规则,我们并不想包含这些杂音。
源码下载
本书演示样例的源码能够从出版社的站点下载。,也能够从作者的代码库中下载,。
作者在线
购买了《有用函数编程》,能够自由訪问由 Manning 出版社经营的私有站点论坛。在这里,你能够评论本书。询问技术问题,得到作者和其它用户的帮助。訪问论坛并订阅的地址。,该页面提供了有关注冊论坛、获得帮助以及行为规范等信息。
Manning 公司有责任为读者了一个有意义的平台。实现读者之间、读者与作者之间进行交流;但并不承担明白应该是作者的责任。对本书论坛的投稿是自愿的(不付费)。我们建议你询问他们一些有挑战性的问题,以免他们失去兴起。
仅仅要书一出版,作者在线论坛和前面讨论的文档就能够从出版社的站点上訪问到。
其它在线资源
除了Manning 公司的站点(http://www.manning.com/Real-WorldFunctionalProgramming)以外,我们还为本书创建了站点,包括一些非常实用的内容,有每一章的源码,另一些不适合放在书中的材料。站点上还能链接到有关函数编程的最新文章。因此,能够通过这里学到很多其它的内容。
假设你对F# 感兴趣,你也能够看看官方的微软开发者中心(Microsoft’s Developer Center)。http://msdn.microsoft.com/fsharp,它包括了近期有关 F# 语言的内容,以及有关文章、视频和其它 F# 资源的链接。假设你想问有关F# 的问题。并保证能得到惬意的答案。你能够訪问F# 社区论坛。。