12.8 第十二章小结
在本章的第一部分,我们讨论了 .NET 序列,用 IEnumerable<T> 类型表示,在 F# 中还称为 seq <'a>。我们开始讨论生成序列的技术,包括高阶函数、迭代器和 F# 序列表达式。我们知道,序列是延迟的,能够创建无穷序列。我们还看到了一个实际的示例,使用颜色的无穷的序列,把绘制图表的代码,与用于在图表中生成颜色的代码分离开来。
接下来,我们讨论了如何处理序列。我们写了相同的代码,使用了高阶函数,对应的 LINQ 的扩展方法,C# 的查询表达式,和 F# 的序列表达式。这有助于我们理解查询和序列表达式是如何工作的。一个最重要的操作是绑定(bind)操作,它在 F# 中以 collect 函数出现,在 LINQ 中是 SelectMany 方法。
许多类型都有同样的概念,单子操作,我们发现,创建 F# 计算表达式,看起来就像序列表达式,只是处理不同的类型。我们提供两个实现计算表达式的实际例子,处理选项类型,和在执行过程中保存日志消息。同样的概念可以用 C# 实现,并有所扩展,把计算表达式替换成查询表达式。F# 语言功能更通用的,而 C# 查询表达式更适合查询。
使用计算表达式最难的地方,也许是确定什么时候设计和实现,最有利。在下一章,我们会讨论使用 F# 计算表达式中的最重要部分,能够进行 I/O 操作,而不会阻塞调用者的线程,这对于执行慢速 I/O,比如,从互联网读数据,是特别重要的。再后,我们将会看到,F# 能够以交互方式和可视化处理数据,这对于今天联系日益紧密的世界,成为非常重要的任务。