12.1 生成序列
有几种生成序列的技术,我们来看一下我们的选项。直接的方法是实现 IEnumerator <T> 接口,提供 Current 属性和 MoveNext 方法,它将枚举数对象移动到下一个元素。这迫使我们显式创建有可变状态的对象,这很明显违反了函数式的风格。通常,我们可以应用隐藏可变异的技术,给我们更加声明式表达生成序列的内容。这类似于在前一章中使用的延迟值。显式使用可变状态 (例如,实现缓存),看起来不像好的函数风格,但当我们隐藏了可变异到 Lazy<'T> 类型,就获得了完全合理的函数式代码。
往常,在函数式编程中,我们可以使用高阶函数。F# 库支持不少的函数处理序列,但我们只看一个例子。后面我们会看到,C# 和 F# 都有简单的方法来生成序列。在 C# 中,我们可以使用迭代,F# 支持通用目的的序列处理的功能,称为序列表达式(sequence expressions)。
有几种生成序列的技术,我们来看一下我们的选项。直接的方法是实现 IEnumerator <T> 接口,提供 Current 属性和 MoveNext 方法,它将枚举数对象移动到下一个元素。这迫使我们显式创建有可变状态的对象,这很明显违反了函数式的风格。通常,我们可以应用隐藏可变异的技术,给我们更加声明式表达生成序列的内容。这类似于在前一章中使用的延迟值。显式使用可变状态 (例如,实现缓存),看起来不像好的函数风格,但当我们隐藏了可变异到 Lazy<'T> 类型,就获得了完全合理的函数式代码。
往常,在函数式编程中,我们可以使用高阶函数。F# 库支持不少的函数处理序列,但我们只看一个例子。后面我们会看到,C# 和 F# 都有简单的方法来生成序列。在 C# 中,我们可以使用迭代,F# 支持通用目的的序列处理的功能,称为序列表达式(sequence expressions)。