5.3.1 F# 中的差别联合
来源:互联网 发布:淘宝免单群怎么挣钱 编辑:程序博客网 时间:2024/05/22 13:52
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")。在这种情况下,语法看起来就像调用函数。对于没有任何额外参数值的选项,就写出识别器名字;有多个参数值的选项,写出参数值,好像就是单个元组一样。
当然,创新值是毫无意义的,除非我们真正可以使用它。让我们尝试用计划来计算一些有用的事情。
- 5.3.1 F# 中的差别联合
- 5.3.1 F# 中的差别联合(discriminated unions)
- 5.3.2.1 用 F# 匹配差别联合
- 5.3.2.2 用 C# 模拟差别联合
- BREW & J2ME:在差别中联合
- HDU6038(多校联合F题)
- 14.2.1 F# 中的颜色计算
- 6.1.1 F# 中的泛型函数
- 2.4.2 差别联合类型(discriminated union type)
- Hibernate 中的联合主键
- c++中的联合
- mysql中的联合查询
- Hibernate 中的联合主键
- Sqlserver 中的联合查询
- SQL中的联合查询
- VC++中的匿名联合
- C++中的联合
- SQL中的联合查询
- 非模式对话框创建
- PCB设计中的注意事项
- Python_django
- 求项目中遇到的jquery 和 prototype 冲突解决方式??在线等待·····
- 动态规划(Dynamic Programming)的一些事一些情
- 5.3.1 F# 中的差别联合
- 影响世界500强的68堂课
- 在linux上以服务的方式启动java程序
- 理财~
- CISCO Site-to-Site IPSEC VPN -- 与天融信设备互联
- 把存储过程返回的数据集填充到DATASET
- 当下即是
- 二叉树遍历
- Java_Java常见疑惑和陷阱