【发布时间】:2013-10-19 07:35:59
【问题描述】:
有没有更惯用的方法来对记录进行模式匹配?我的代码似乎不正确。
type Period = AM | PM
type TimeOfDay = {hours : int; minutes : int; p : Period}
let before (tod1 : TimeOfDay, tod2 : TimeOfDay) =
match tod1, tod2 with
| {hours = h1; minutes = m1; p = AM}, {hours = h2; minutes = m2; p = AM} -> (h1, m1) < (h2, m2)
| {hours = h1; minutes = m1; p = PM}, {hours = h2; minutes = m2; p = PM} -> (h1, m1) < (h2, m2)
| {hours = _; minutes = _; p = AM}, {hours = _; minutes = _; p = PM} -> true
| {hours = _; minutes = _; p = PM}, {hours = _; minutes = _; p = AM} -> false
【问题讨论】:
-
如果您将
Period移动到TimeOfDay中的第一个字段,那么TimeOfDay值自然会按照您期望的顺序排序,因此您可以使用tod1 < tod2。这是因为AM在Period的定义中出现在PM之前。不过对你的问题没有帮助。 -
如果由于某种原因您无法重新排序记录字段(例如,如果它们来自外部库),您仍然可以使用
(tod1.p, tod1.hours, tod1.minutes) < (tod2.p, tod2.hours, tod2.minutes)。 -
或者,您可以切换到 24 小时制:
let adjust = function | {hours=h; minutes=m; p=PM} -> {hours=h+12; minutes=m; p=AM} | x -> x,然后将应用此功能的结果与两条记录进行比较:let before (tod1, tod2) = adjust tod1 < adjust tod2。