12.3.1 用迭代器转换序列
到目前为止,我们只是用迭代器,从一段数据(如果有的话)生成序列。然而,迭代器通常用来以某种方式,进行序列的转换。作为一个简单的例子,这里有一个方法,把数字序列转换成平方序列:
IEnumerableSquares(IEnumerable numbers) {
foreach(int i in numbers)
yield return i...
分类:
其他好文 时间:
2015-01-22 18:20:34
阅读次数:
187
12.3.2 筛选和映射
最常用的序列处理运算,是筛选(filtering)和映射(projection);在第六章,我们用它们处理 F# 函数式列表,和 C# 的泛型 .NET List 类型。LINQ 库中的 Where 和 Select 扩展方法已经可以处理序列,而在 F# 中,使用Seq 模块中两个函数(即 Seq.map 和 Seq.filter),能达到相同效果。...
分类:
其他好文 时间:
2015-01-22 18:07:14
阅读次数:
148
12.3 处理序列
处理序列,可供选择的范围很广泛,包括从低级技术,能控制一切,但难以表达更复杂而通常的处理模式,到更高级技术,虽然不能表达我们所有可能想要的,但会更优雅。
在 C# 中,最低级的(除了直接实现 IEnumerable 接口)是使用迭代器块(iterator blocks),读取输入的序列,既可以使用 foreach,也可以使用枚举对象;而更高级的,我们可以使用预定义的(...
分类:
其他好文 时间:
2015-01-22 15:30:53
阅读次数:
123
12.2.2 无穷序列
在前一章,我们简单演示过使用延迟值,实现延迟列表。这种数据结构可以用来创建无穷数据结构,比如,从零开始的整数列表。这之所以可能,是因为每个元素的计算被推迟了:只在访问元素时,才计算它的值,并且,每次只关注一个元素的计算。
使用seq 表示序列是相似的。该接口有一个方法MoveNext,计算出下一个的元素。序列可能是无穷的,即,MoveNext 方法始终能够计算出下...
分类:
其他好文 时间:
2015-01-22 11:11:06
阅读次数:
263
12.2.1 递归的序列表达式
函数式编程中主要的控制流结构是递归。我们已经在很多例子中,写的普通函数就使用过递归,它能够解决命令式编程中的循环问题,而不需依赖可变状态。当我们想写一个简单的递归函数时,要使用 let rec 关键字,这样,就能函数以递归方式调用自身。
用于组合序列的 yield! 结构,也可以在序列表达式中执行递归调用,所以,我们同样可以使用函数编程的方法,生成序列。清...
分类:
其他好文 时间:
2015-01-21 16:37:06
阅读次数:
152
12.1.3.1 写序列表达式
在 C# 中,当我们实现返回 IEnumerable、IEnumerator,或对应的非泛型方法时,可以自动使用迭代器。F# 序列表达式使用 seq 标识符显式标记,而且不必要使用方法体或函数体。正如其名字所暗示的,序列表达式是表达式的不同类型,我们可以在代码中的任意位置使用。清单 12.2 演示了使用此语法,创建简单的序列。
清单 12.2 介绍序...
分类:
其他好文 时间:
2015-01-20 15:45:07
阅读次数:
175
12.1.2 在 C# 中使用迭代器
当C# 2.0 最初引入迭代器时,最常见的用途是为了使自己集合的 IEnumerable 接口的实现更简单。在 C# 中使用的编程风格已经有了演变,现在迭代器能与其它函数式结构一起使用,进行各种数据处理操作。
迭代器可以用来生成任意序列。我们先从一个简单的示例开始,生成阶乘小于一百万的序列,并格式化成字符串形式。清单 12.1 显示了完整的源代码。
...
12.1.3 使用 F# 序列表达式
在 C# 中的迭代器非常方便(comfortable),能够在普通的 C# 方法中写复杂的代码(实现 IEnumerable/IEnumerator 接口的类型)。开发人员写的代码使用标准的C# 功能,比如环,唯一的改变只是我们可以使用一种新的语句,来做一些非标准的事情,这个新语句用 yield return 表示(或者 yield break 表示终...
分类:
编程语言 时间:
2015-01-19 10:57:06
阅读次数:
219
12.1.1 使用高阶函数
在F# 中,处理序列的函数在Seq 模块中,我们将解释一个非常普通的函数,Seq.unfold。可以看到,与fole 函数是一对,它的参数为集合,把集合“折叠”成一个值;unfold 的参数一个值,把这个值“展开”为序列。下面的代码片断生成的序列,包含格式化为字符串的、 0 到10 的数字:
> let nums = Seq.unfold (fun nu...
分类:
其他好文 时间:
2015-01-18 18:36:52
阅读次数:
191
第十二章序列表达式和可选工作流
本章介绍
■生成和处理序列值
■处理 F# 序列表达式
■理解单子和 LINQ 表达式
■实现 F# 计算表达式
在我们开始讨论序列表达式之前,必须知道什么是序列(sequence),这也是数学的F# 术语。序列是有序的列表,可能包含无穷的元素。这一切听上去有点抽象,但也不用担心,我们已经熟悉这种类型了,在.NET 中表达同样概念的是:...
分类:
其他好文 时间:
2015-01-18 11:53:04
阅读次数:
143