12 第十二章 序列表达式和选择工作流
本章介绍
■ 生成和处理序列值
■ 处理 F# 序列表达式
■ 理解单子和 LINQ 表达式
■ 实现 F# 计算表达式
在我们开始讨论序列表达式之前,必须知道什么是序列(sequence)。这是另一个来自于数学的 F# 术语,序列是排序的列表,它可能包含无穷的元素。不用担心这一切听上去有点抽象,我们已经熟悉这种类型,.NET 中的相同表达:IEnumerable<T>。
在 .NET 框架中有 IEnumerable<T> 类型的主要原因,是它给我们提供一种统一的方法,来处理集合数据,比如数组,词典,可变列表,不可变的 F# 列表。在 F# 中,我们将讨论序列,因为这是更通用的术语。序列可以表示有限元素的集合,但它也可以动态生成,在需要时恢复。我们将学习无穷序列,这听起来有些学术化,但是,在实际应用中仍可能很有用。
我们首先看一下创建和处理序列的方法。传统的函数技术使用高阶函数,但是,现代语言通常提供了更容易的方法。在 C# 中,我们可以使用迭代来生成一个序列,用 LINQ 查询去处理已有的序列。F# 语言把这两个概念统一起来,可以用序列表达式(sequence expressions)写大部分操作。
在 F# 中,用于写序列表达式的语法并不是添加设计序列的单一用途的语言功能。这正是一个 (非常有用 !) 应用程序,一个更通用的结构,称为计算表达式(computation expressions)。计算表达式可用于写这样的代码,看起来像普通的 F#,但行为却有所不同。在序列表达式情况下,产生的序列结果不仅仅是一个值,我们来看一下另外的示例。我们将向你展示如何使用计算表达式进行日志记录,以及如何使选项值容易使用。
注意
在很多方面,计算表达式可用于自定义代码的含义,但也有一些限制。特别是,使用计算表达式写的代码都必须作为编译的 .NET 代码执行,其中,我们只能自定义里面很少的基元。它不能用于操作代码,在不同环境中执行,比如,就像 LINQ to SQL 所做的。要在 F# 中做类似的事情,我们必须组合来自本章的概念,一个称为 F# 引用(F# quotations)的功能,本书并不讨论。在本书的网站上,你会找到有关引用的资源。
我们首先讨论序列,在熟悉了序列表达式以后,再讨论计算表达式,以及它们与 C# 中 的 LINQ 查询的关系如何。让我们从序列迈出第一步。在我们可以使用序列之前,要知道如何创建序列。
本章介绍
■ 生成和处理序列值
■ 处理 F# 序列表达式
■ 理解单子和 LINQ 表达式
■ 实现 F# 计算表达式
在我们开始讨论序列表达式之前,必须知道什么是序列(sequence)。这是另一个来自于数学的 F# 术语,序列是排序的列表,它可能包含无穷的元素。不用担心这一切听上去有点抽象,我们已经熟悉这种类型,.NET 中的相同表达:IEnumerable<T>。
在 .NET 框架中有 IEnumerable<T> 类型的主要原因,是它给我们提供一种统一的方法,来处理集合数据,比如数组,词典,可变列表,不可变的 F# 列表。在 F# 中,我们将讨论序列,因为这是更通用的术语。序列可以表示有限元素的集合,但它也可以动态生成,在需要时恢复。我们将学习无穷序列,这听起来有些学术化,但是,在实际应用中仍可能很有用。
我们首先看一下创建和处理序列的方法。传统的函数技术使用高阶函数,但是,现代语言通常提供了更容易的方法。在 C# 中,我们可以使用迭代来生成一个序列,用 LINQ 查询去处理已有的序列。F# 语言把这两个概念统一起来,可以用序列表达式(sequence expressions)写大部分操作。
在 F# 中,用于写序列表达式的语法并不是添加设计序列的单一用途的语言功能。这正是一个 (非常有用 !) 应用程序,一个更通用的结构,称为计算表达式(computation expressions)。计算表达式可用于写这样的代码,看起来像普通的 F#,但行为却有所不同。在序列表达式情况下,产生的序列结果不仅仅是一个值,我们来看一下另外的示例。我们将向你展示如何使用计算表达式进行日志记录,以及如何使选项值容易使用。
注意
在很多方面,计算表达式可用于自定义代码的含义,但也有一些限制。特别是,使用计算表达式写的代码都必须作为编译的 .NET 代码执行,其中,我们只能自定义里面很少的基元。它不能用于操作代码,在不同环境中执行,比如,就像 LINQ to SQL 所做的。要在 F# 中做类似的事情,我们必须组合来自本章的概念,一个称为 F# 引用(F# quotations)的功能,本书并不讨论。在本书的网站上,你会找到有关引用的资源。
我们首先讨论序列,在熟悉了序列表达式以后,再讨论计算表达式,以及它们与 C# 中 的 LINQ 查询的关系如何。让我们从序列迈出第一步。在我们可以使用序列之前,要知道如何创建序列。