9.4.2.1 在 F# 中实现接口
清单 9.17 使用 C# 中的显式接口实现,因为,这是 F# 允许的唯一的接口实现的风格。在函数编程风格中,这通常足够了。如果确实需要直接公开类的功能,可以添加额外的、调用相同代码的成员。清单 9.18 显示了前面示例的 F# 版本。
清单 9.18 在类中实现接口 (F#)
type CoefficientTest(incomeCoeff...
分类:
其他好文 时间:
2014-12-12 16:46:59
阅读次数:
136
9.4 具体的对象类型
面向对象编程中的最重要的结构,就是类的声明。它的价值体现用 F# 写的库,可以在 C# 中使用,因为从 C# 中引用F# 声明的类时,看起来就像普通的类。从概念上讲,类有一点像带成员的记录,因为,它们把值存储在字段中,并提供成员进行访问;类还有另外的功能,在 F# 中,出现下列情况,通常使用类:
■ 需要封装数据和行为时。
■ 在迭代开发过程的后期,把简单的元组...
分类:
其他好文 时间:
2014-12-12 11:49:28
阅读次数:
174
9.4.1 函数式和命令式类
在类或者类的构造函数的参数值中的 let 绑定,就像我们在其他 F# 代码中看到的 let 绑定一样,也是不可变值;此外,使用 member 关键字声明的属性,创建的是只读属性(只有 getter)。因此,如果类只引用其他不可变类型的值,那么,类也不可变。
比方说,在前面的例子中,我们要允许改变客户的收入,可以有两种方式:
■以纯函数式风格,对象将返回一...
分类:
其他好文 时间:
2014-12-12 11:42:13
阅读次数:
146
9.3.2.1 用关键字 use 编程
我们已经知道,如果用关键字 use 创建值,编译器会自动在声明这个值的函数结尾,插入对 Dispose 方法的调用。这对于资源管理来说是有用的,但还有其他情况,我们需要在两个函数调用之间加包括一段代码。
假设我们希望用不同的颜色输出文本到控制台,然后,再恢复原来的颜色。用传统的方法,我们必须保存原来的颜色,设置新的颜色,发送输出到控制台,再恢复原来...
分类:
其他好文 时间:
2014-12-11 17:28:44
阅读次数:
142
9.3.1 使用 .NET 集合
到目前为止,虽然我们主要是用F# 内置的列表类型来保存数据集合,在某些情况下,使用其他的 .NET 类型,比如,System.Collections.Generic 命名空间下的 Dictionary 类,也是有用的。这种类型对需要根据键进行快速访问,特别有用,因为提供了类似功能的不可变类型(比如,F# 库中的 Map),效率低下。
需要注意的是,Dic...
分类:
Web程序 时间:
2014-12-11 15:59:47
阅读次数:
152
9.3.2 用 IDisposable 接口清理资源
我们已经使用过几种实现了 IDisposable 接口的类型,比如,Graphics 和 SolidBrush。我们想使代码尽可能易于理解,因此,当使用完对象时,我们就显式调用 Dispose 方法。
C# 中包含了语法糖,以 using 语句的形式,保证了即使语句体内抛出异常,也能调用 Dispose;F# 有相似的结构,用 use...
分类:
其他好文 时间:
2014-12-11 15:52:46
阅读次数:
142
9.2.2 使用接口对象类型
就像记录和差别联合一样,接口类型使用 type 构造来声明。清单 9.8 显示了把以前的检查记录类型,转换为接口类型。
清单 9.8 用接口表示客户检查 (F#)
type ClientTest =
abstract Check : Client –> bool
abstract Report : Client -> unit
在...
分类:
其他好文 时间:
2014-12-11 12:28:30
阅读次数:
128
9.2 改进以行为为中心的应用程序
在前面几章,我们已经展示了函数编程的几个基本概念,可以组合起来,获得所需的结果。在讨论构造数据类型的方法时,我们已经看到了这的示例,有元组、函数、差别联合和记录类型。
创建以行为为中心的应用程序,我们使用函数类型表示行为,它可以与其他类型组合。例如,使用记录类型可以在一个值中保存两个相关的函数。...
分类:
其他好文 时间:
2014-12-10 16:29:54
阅读次数:
173
9.1.2 使用类型扩展追加成员
在上一节我们提到过,可以为任何 F# 数据类型添加成员;现在,我们将使用差别联合来演示。这种种方法能够添加成员,而不需要修改任何原始代码。这样,我们将能够保留原始类型和原始的函数声明,不作修改,然后添加成员。
我们将扩展第五章声明 schedule 类型的示例,这个类型表示的事件可以只发生一次,或重复发生,或从不发生。除了数据类型之外,我们还创建了计算...
分类:
其他好文 时间:
2014-12-10 16:28:30
阅读次数:
210
9.2.1 使用保存的函数记录
使用记录保存函数,是 OCaml 中的常用方法,在 F# 中有所扩展。在看到可能的改进之前,清单 9.7 为第八章的原始解决方案提供了提醒功能。
清单 9.7 用函数的记录检查客户 (F#)
type ClientTest =
{ Check : Client –> bool
Report : Client-> unit...
分类:
其他好文 时间:
2014-12-10 16:26:50
阅读次数:
136