8.3.3 F# 代码的进一步演变
在上一节,我们经历了从一段简单的 F# 代码,它保存函数的列表开始,到更复杂的版本,使用记录的列表,这是我们在第一章讨论的 F# 开发过程的一部分。我们知道F# 程序通常是非常简单的脚本开始,逐步演变成标准的遵循 .NET 编程准则的代码,且从.NET 对象模型中受益。
我们开始用最简单的方法来解决问题,仅使用我们在开始时所知道的。当后来意识到需要添加...
分类:
其他好文 时间:
2014-12-04 15:37:19
阅读次数:
120
8.3.1 函数的记录
我们已经看到一种处理多个函数的方法。在前面的示例中,返回结果为函数元组,同样的技术可以表示有新增报表功能的应用程序。报表函数的参数为客户,在屏幕上输出信息,返回结果为 unit。使用这种表示方法,行为列表的类型将是:
((Client -> bool) * (Client -> unit))list
初看起来有点可怕,很复杂,函数没有名字,使代码不具...
分类:
其他好文 时间:
2014-12-04 12:14:38
阅读次数:
111
8.2.3.2 在闭包中捕捉引用单元
现在,我们可以编写代码,捕获在闭包中使用引用单元创建的可变状态。清单 8.9 显示了可配置收入检查的 F# 版本。我们创建了 createIncomeTests 函数,返回有两个函数的元组:第一个函数改变所需的最低收入,第二个函数测试函数自身。
清单 8.9 使用闭包测试可配置收入 (F# Interactive)
> let createI...
分类:
其他好文 时间:
2014-12-03 19:25:22
阅读次数:
177
8.3 使用组合行为
在这一章,我们所讨论处理行为的应用程序或组件,能够在开发的后期,甚至在运行时添加新的行为;关键的设计思想是要保证添加新的行为要尽可能容易。在我们实现新的功能之后,应该可以注册这个函数(例如,通过将其添加到列表),并在应用程序使用,而不需要修改任何代码。
为使问题简化,最好是使需要实现的函数数量最小化。通常情况下,一个函数足以表示功能,但在某些情况下,可能需要包含额外...
分类:
其他好文 时间:
2014-12-03 19:22:41
阅读次数:
161
8.2.3.1 可变状态使用引用单元
要回答这个问题,我们需要能够创建一些要捕获的状态。一个方法是用 let mutable,但是,这样,并不能运行,因为这种可变值只能用于局部,不能被闭包捕获。
第二个方法是使用引用(ref)类型创建可变值,即引用单元(reference cell)的缩写,它是能够包含可变值的小对象(实际上,声明为 F# 的记录类型)。要理解引用类型的原理,我们在 C#...
分类:
其他好文 时间:
2014-12-03 15:45:10
阅读次数:
189
8.2.2 命令设计模式(The command design pattern)
命令模式(commandpattern)所描述的方法,表示在应用程序中的动作,相对于前一个模式,它常用于参数化已知的行为(比如,筛选列表)但缺少部分(条件),而命令模式经常保存某些“工作单元”,能够在以后调用。我们经常看到命令集合,用来描述用户可以选择处理或操作的步骤。看一下图8.2,就会认识到,接口看起来像...
分类:
其他好文 时间:
2014-12-02 16:40:43
阅读次数:
198
8.2 用于处理函数的习惯用语
在前一章,我们讨论了数据结构和相关的设计模式,看到结构模式的两个的示例,与设计函数式数据结构的问题相关,还讨论了行为模式,用于描述对象如何进行通信,在函数术语中,它相当于函数之间如何彼此调用。
在本章,我们将讨论面向行为的应用程序,因此,很自然地,相关的模式将是行为模式,其中第一个称为策略模式(strategy pattern)。...
分类:
其他好文 时间:
2014-12-02 11:52:21
阅读次数:
123
8.2.1 策略设计模式(The strategy design pattern)
在运行时,如果应用程序需要在几种算法之间,或一种算法的不同部分之间进行选择的话,策略模式是非常有用的。一种常见的情况是,当我们的应用程序需要执行的几个任务,只在很小的子任务上是不同的。使用策略模式,对于任务的公用部分,我们只要写一次,加上参数化,子任务(原始操作)作为它的参数值。图 8.1 显示了用面向对象...
分类:
其他好文 时间:
2014-12-02 11:51:50
阅读次数:
134
8.1.4 在 F# 中使用函数列表
首先,我们声明一个表示有关客户信息的类型;客户有很多属性,因此,用F# 的记录类型表示最自然的选择,我们在前一章已经看过。清单 8.4 显示了类型声明,和所创建样本客户的代码。
清单 8.4 Client 记录类型和样本值 (F# Interactive)
> type Client =
{ Name : string; Inco...
分类:
其他好文 时间:
2014-12-02 10:37:42
阅读次数:
190
8.1.3 在 C# 中使用函数集合
考虑对客户进行贷款时,我们想要执行所有测试,并统计返回 true 的测试数(指高风险)。如果数为零个或一,程序就建议贷款。通常常的命令式解决方案是,声明一个变量,使用 foreach 语句枚举测试;在循环体内,执行测试,如果返回 true,变量就增加;使用 LINQ的扩展方法 Count,实现可以更优雅(清单 8.3)。
清单 8.3 执行测试...