5.3.2.1 用 F# 匹配差别联合
来源:互联网 发布:淘宝上送的优酷会员 编辑:程序博客网 时间:2024/06/06 01:58
5.3.2.1 用 F# 匹配差别联合
当使用差别联合时,必须要处理所有可能的选项,因为,我们不知道这个值到底表示哪一个选项。回忆一下以前类似的情况,处理列表时,问题要检查列表是否为空,我们是使用模式匹配实现的:match 构造能够根据几种模式检查值。我们可以用同样的功能,处理差别联合,只是这里模式换成了识别器。清单 5.5 是获取计划事件下一次发生时间的示例。
清单 5.5 计算事件的下一次发生 (F#)
let getNextOccurrence(schedule) =
matchschedule with
|Never -> DateTime.MaxValue [1]
|Once(eventDate) –> [2]
if(eventDate > DateTime.Now) then eventDate
elseDateTime.MaxValue
|Repeatedly(startDate, interval) –> [3]
letsecondsFromFirst = (DateTime.Now - startDate).TotalSeconds
let q = secondsFromFirst /interval.TotalSeconds | [4]
letq = max q 0.0 |
startDate.AddSeconds
(interval.TotalSeconds * (Math.Floor(q) + 1.0))
这个示例是有点复杂,但它展示了F# 程序的典型结构。我们使用标准 .NET DateTime 和 TimeSpan 结构处理日期和时间;使用模式匹配检查已经选择了哪一个计划。第一种情况[1],返回 DateTime.MaxValue,这是一个特殊值,用来表示事件在未来所有日期都没有计划;第二种情况[2],如果事件还没有发生,则返回事件日期;最后一种情况(重复事件)更复杂[3],我们首先计算过去已经发生了多少次事件,返回下一次发生的时间。可以看到,我们在代码中两次声明 q 值[4],这称为隐藏值(hiding a value),如果我们想把复杂的计算拆成两个或更多个步骤,这是很有用的,可以确保我们不会意外地使用中间值。
可以发现,用于检查值是否值匹配特定的识别器的模式,与我们在前面用于构造值的模式完全相同;模式也提取保存的值作为参数值,指定给新的值(分别是 eventDate 和带 interval 的 startDate),这样,我们就可以立即使用它们。
- 5.3.2.1 用 F# 匹配差别联合
- 5.3.1 F# 中的差别联合
- 5.3.1 F# 中的差别联合(discriminated unions)
- 5.3.2.2 用 C# 模拟差别联合
- NYOJ 多校联合训练 Problem F 不是匹配(思维)
- BREW & J2ME:在差别中联合
- HDU6038(多校联合F题)
- 问题 F: 字符串匹配问题
- 2.4.2 差别联合类型(discriminated union type)
- MySQL 联合索引最左匹配原则
- F-SLIKAR 多校联合第七场 搜索问题
- [DFS] 多校联合第二场 F题 Friends
- 【二分图匹配入门专题1】F
- 差别
- 差别
- sql嵌套查询和多表联合查询之间的差别
- 联合
- 联合
- Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析
- 人工智能——产生式规则
- There is no best sorting algoritm: 没有最好关键是找到合适的。
- Android 4.4 Kitkat Phone工作流程浅析(四)__RILJ工作流程简析
- HDU 4864 Task(贪心)
- 5.3.2.1 用 F# 匹配差别联合
- Android 4.4 Kitkat Phone工作流程浅析(五)__MT(来电)流程分析
- View中getMeasuredHeight()和getHeight()区别
- IOS开源库一览表
- IOS 微信支付界面乱码问题
- POJ 3243 Clever Y Extended-Baby-Step-Giant-Step
- apache shiro的工作流程分析
- Java获取uri and ?username=tom&age=22
- Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程