5.3.1 F# 中的差别联合

5.3.1 F# 中的差别联合

 

    像这种突然出现的类型在函数编程中相当频繁,所以,函数语言倾向于使创建和使用类型更方便。在 F# 中,这种支持功能称为差别联合(discriminated unions)。与元组不同,差别联合必须事先声明,因为,在我们可以创建表示计划的值之前,性质声明这个类型,要有名字,最重要的是,要有它能够表示的选项。清单 5.3 显示了在 F# 中表示计划的类型。
 

Listing 5.3 Schedule type using discriminated union (F#)

 

type Schedule =
  | Never
  | Once of DateTime
  | Repeatedly of DateTime * TimeSpan

 

    当创建 Schedule 类型时,我们组合了几种情况,需要能够区分不同选项,所以,我们还为每个选项也指定一个名字 (Never, Once, 和 Repeatedly)。名称通常称为识别器(discriminators),因为,它们区分各种情况。这意味着,Schedule类型的每个值携带其识别器,为选定的选项保存值(例如,在我们的示例中的最后一种情况中的 DateTime 和 TimeSpan)。如你所见,当存储多个值为单独的选项时,我们使用一个星号。这类似于创建元组的语法,因此,可以看到这两个概念如何很好地结合一起(多值和可选值)。

    我们还需要识别器,当创建 Schedule 的类型值时,因为,这个识别器指定了我们使用的哪种情况。清单 5.4 显示了几个示例。
 

Listing 5.4 Creating values of discriminated union (F# Interactive)

 

> open System;;

> let tomorrow = DateTime.Now.AddDays(1.0)
let noon = new DateTime(2008, 8, 1, 12, 0, 0)
let daySpan = new TimeSpan(24, 0, 0);;

val tomorrow : DateTime
val noon : DateTime
val daySpan : TimeSpan
> let schedule1 = Never;;
val schedule1 : Schedule = Never
> let schedule2 = Once(tomorrow);;
val schedule2 : Schedule = Once(2.8.2008 17:29:07)
> let schedule3 = Repeatedly(noon, daySpan);;
val schedule3 : Schedule = Repeatedly(1.8.2008 12:00:00, 1.00:00:00)

 

    如你所见,创建 Schedule 类型的值相当容易。我们使用识别器作为值构造函数,这类似于我们以前使用的值构造函数,比如,创建元组 (7,"seven")。在这种情况下,语法看起来就像调用函数。对于没有任何额外参数值的选项,就写出识别器名字;有多个参数值的选项,写出参数值,好像就是单个元组一样。

    当然,创新值是毫无意义的,除非我们真正可以使用它。让我们尝试用计划来计算一些有用的事情。

你可能感兴趣的:(C#,F#,休闲,函数编程,差别联合)