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
12.1 生成序列
生成序列有几种方法,先来看一下我们的选择,直接的方法是实现IEnumerator 接口,提供 Current 属性,和 MoveNext方法,将枚举数对象移动到下一个元素。这要求显式创建有可变状态的对象,很明显违反了函数式风格。通常的做法是隐藏可变性,提供更具声明式的方法,表达生成序列的内容,这类似于在前一章使用的延迟值。显式使用可变状态(例如,实现缓存),看起来不是...
分类:
其他好文 时间:
2015-01-18 11:54:45
阅读次数:
173
第十二章序列表达式和可选工作流
本章介绍
■生成和处理序列值
■处理 F# 序列表达式
■理解单子和 LINQ 表达式
■实现 F# 计算表达式
在我们开始讨论序列表达式之前,必须知道什么是序列(sequence),这也是数学的F# 术语。序列是有序的列表,可能包含无穷的元素。这一切听上去有点抽象,但也不用担心,我们已经熟悉这种类型了,在.NET 中表达同样概念的是:...
分类:
其他好文 时间:
2015-01-18 11:53:04
阅读次数:
143
11.5 第十五章小结
这一章的主题主要是函数程序的重构,我们已经看到了大量的示例和概念。我们首先讨论了在数学意义上的重构,可以发现,在数学意义上,很容易推导出“代码”,因此,可以看到特定的改变在何时是正确的。由于其根源在数学中,因此,函数式编程通常也有这样的属性。
我们首先探讨了使用函数类型,能够减少代码重复,这是重构的简单情况;然后发现,使用函数式编程,能够方便跟踪代码中的相关性,因...
分类:
其他好文 时间:
2015-01-16 16:45:43
阅读次数:
157
11.4.2.2 实现用户界面
现在,我们已经有了关于处理照片所需要的所有数据,下面就可以添加简单的图形用户界面,使用 Windows 窗体。在清单 11.22 中,我们将创建两个控件以显示数据,代码显示选定的照片。
清单 11.22 添加照片浏览器的用户界面 (F#)
open System
open System.Windows.Forms
let main =...
分类:
其他好文 时间:
2015-01-16 14:41:35
阅读次数:
184