您的位置:首页 > 其它

2.4.2 介绍差别联合类型

2011-03-27 15:37 162 查看
2.4.2 介绍差别联合类型

在这一节中,我们将关注差别联合(discriminated union)类型,它是基本函数类型之一。我们先看一个示例,说明了它的作用。假设你要写一个处理形状的图形应用程序。我们将使用一种简单的形状表示形式,因此,就选择矩形、椭圆 (由矩形边界的角定义),或由其他两个形状组合的形状。

如果你使用面向对象的概念考虑这个问题,也许说,需要一个抽象类来表示(让我们叫它 Shape)形状,三个派生类表示三种不同的情况 (椭圆、矩形和组合的)。使用面向对象的术语,现在我们心中有四个类来描述这个问题。此外,我们还不知道用形状来做什么。我们有可能会把它们画出来,但还不知道需要哪些参数值来绘图,因此还无法写出 Shape 类的任何抽象方法。

我们最初的想法是比这种成熟的类层次结构更简单:我们只是需要表示三种不同情况下的形状,我们想要定义一个简单的数据结构,用来表示形状——F# 正允许我们这样做:

type Shape =

| Rectangle of Point * Point

| Ellipse of Point * Point

| Composed of Shape * Shape

这段代码创建一个差别联合类型 Shape,它更接近于我们的最初开始描述这个问题时的意图。如你所见,这个类型声明包含三个例,涵盖了三种可能的形状的表示形式。当在 F# 中处理这个类型的值时,我们写出的代码,比如,Rectangle(pt1,pt2), 创建一个矩形。不同于在 C 语言中的联合,这个值被标记了,这意味着,我们总是知道它代表了哪个选项。在下一节我们会看到这一事实,处理差别联合值是相当重要的。

F# 中的通常的开发过程,先设计保持程序数据所需的数据结构,我们将在第 7 至 9 章更加详细探讨这一问题。在下一节中,我们将介绍模式匹配,这一概念使许多典型函数编程任务更容易。虽然模式匹配看上去是与类型不相关的概念,但还是会看到有一些重要的联系。除其他事项外,我们可以使用模式匹配来实现处理差别联合的函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: