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
11.4.2.1 使用延迟值进行缓存
应用程序中最重要的部分是,应用程序启动时执行的代码,找到指定目录中的所有文件,并创建有关每个文件信息的数组;这些信息包含文件名,和为了展示调整大小而计算的延迟值。清单 11.21 是为此而创建的数据结构。
清单 11.21 创建有关图片信息的集合 (F#)
open System.IO
open System.Drawing
t...
分类:
其他好文 时间:
2015-01-16 11:20:14
阅读次数:
132
11.4.1 无穷列表
这一节的标题听起来可能有点奇怪(或疯狂),所以,需要解释一下。函数式列表是我们经常使用的一种数据结构。如果我们想要表示逻辑上无穷的列表,例如,所有质数的列表。当然,我们不可能用到所有的数字,只是像这样使用数据结构,而不必考虑长度。如果列表是无穷的,我们就能够访问尽可能多的数字,只要我们需要。
除了数学上的挑战以外,同样的概念在许多主流编程中也是有用的。当我们在第四...
分类:
其他好文 时间:
2015-01-16 10:11:07
阅读次数:
164
11.4.2 在照片浏览器中缓存值
下面的示例,我们将写一个应用程序,找出指定文件夹中所有照片,并以列表形式显示;当用户选择一张照片,应用程序调整大小,在窗口中显示。(为了简便起见,我们不会允许用户调整窗口大小)。当我们展示(draw)照片时,将需要调整其大小以适合屏幕,然后,调整后的尺寸显示图像。
很明显,在应用程序启动时,我们不想调整所有照片的大小:对于照片很多的情况,需要花费大量的...
分类:
其他好文 时间:
2015-01-16 10:09:12
阅读次数:
148
11.4 实用延迟值
如果我们有一系列计算,可能要花很长时间,并且只在需要时才计算这个(些)值,这时,延迟值就很有用了。在这种情况下,可以得益于缓存,我们在上一节已经用 C# 实现过,把延迟值作为缓存,在需要时才填充。
延迟值的另一个重要用途,是表达一些概念时,很难以其他方式编程。我们将先Haskell 提供的几个例子,讨论有关延迟值的实际使用;Haskell 在每一处都使用延迟计算,这...
分类:
其他好文 时间:
2015-01-15 12:57:19
阅读次数:
169