在第二部分,我们讨论了大多数函数语言常见的函数概念。现在可以说已经理解了函数式编程,就像在阅读了封装、继承和多态性以后,可以说熟悉面向对象编程一样;但要想成为有效的面向对象的开发人员,还需要学习其他内容,用 F# 进行函数编程也没有什么不同。
就像每种面向对象语言的功能各有特色一样,在 F# 中也有一些特有的功能,在其他函数语言中通常没有,当我们在第九章讨论有关对象的类型和成员时,会看到这方面的示例。在 .NET 世界中,F# 是一等公民(first-class citizen),能够使用和声明标准的 .NET 对象。我们将看到如何将标准的函数代码封装成对象,在迭代开发风格中,这往往是下一步要做的。对象提供更好的方法,实现代码的结构化,而且更容易从 C# 中使用 F# 函数。
我们还将讨论适合于函数式 F# 代码的最佳做法。在第十章,我们会探讨优化 F# 程序的方法。解释如何防范使用递归时的堆栈溢出,提供改进程序性能的技术。第十一章,我们将讨论重构(refactoring)和单元测试(unit testing),现在,有两种做法被认为是几乎任何语言或编程范式所必不可少的。特别是,我们会看到不可变性给两个领域带来的影响。
第十二章,我们将讨论用于处理序列和集合的更好方法,以及关于单子(monads)的概念,这在编程语言中是最神秘的术语,但是,它们实际上不那么复杂。在某种意义上,它就是一种设计模式,用更简单的片段组成代码,因此,单子的作者可以指定额外的方面或行为,由用户写的片段添加到其中。我们会将看到,我们一直在使用这种模式,只是没有明确说出来。
在读完本书的这一部分之后,一般情况下,就能够写出高效的函数程序,而且可以利用多种F# 特定的语言功能。我们将学习如何在.NET 平台使用函数编程,包括能够组合函数式、面向对象和命令风格的能力,而且能够使用标准技术来编写和测试代码。读完这部分以后,就可以成功找到一份 F# 程序员的工作;我们当然不是建议就跳过第四部分,它提供的示例组合了本书讨论的所有函数式技巧。