模式匹配多个日期
Pattern match multiple dates
根据 ,我可以像这样匹配 DateTime.MinValue
:
let result =
match date with
| d when d = DateTime.MinValue -> 1
| _ -> 0
如果我有这样的比赛,我该怎么做?
let result =
match (startDate, endDate) with
这行不通:
let result =
match (startDate, endDate) with
| d when d = DateTime.MinValue, e when e = DateTime.MinValue -> 0
第二个 when
的编译器错误:
Unexpected keyword 'when' in pattern matching. Expected '->' or other token.
when
可以添加到整个模式,而不是嵌套模式,所以你需要这样的东西:
match (startDate, endDate) with
| d, e when d = DateTime.MinValue && e = DateTime.MinValue -> 0
| _ -> 1
请注意,在这种情况下,模式匹配并不是真正必要的,您可以选择更简单的方法:
if d = DateTime.MinValue && e = DateTime.MinValue then
0
else
1
一种可能的替代方法是部分活动模式,方法是将部分逻辑移入其中。当匹配所有元组模式时匹配规则,当 return 是 Some
值时匹配部分活动模式。
这里的部分活动模式是 DateTime -> unit option
类型,因为无论如何我们都将忽略 return 值。
let (|IsMinValue|_|) d =
if d = DateTime.MinValue then Some() else None
match startDate, endDate with
| IsMinValue, IsMinValue -> 0
| _ -> 1
我也会使用部分活动模式。但我会向模式添加参数,使其更易于重用。
let (|IsEqual|_|) shouldBe actual =
if actual = shouldBe then Some actual else None
let isMinDate startDate endDate =
match startDate, endDate with
| IsEqual DateTime.MinValue d, IsEqual DateTime.MinValue e -> 1
| _ -> 0
根据 DateTime.MinValue
:
let result =
match date with
| d when d = DateTime.MinValue -> 1
| _ -> 0
如果我有这样的比赛,我该怎么做?
let result =
match (startDate, endDate) with
这行不通:
let result =
match (startDate, endDate) with
| d when d = DateTime.MinValue, e when e = DateTime.MinValue -> 0
第二个 when
的编译器错误:
Unexpected keyword 'when' in pattern matching. Expected '->' or other token.
when
可以添加到整个模式,而不是嵌套模式,所以你需要这样的东西:
match (startDate, endDate) with
| d, e when d = DateTime.MinValue && e = DateTime.MinValue -> 0
| _ -> 1
请注意,在这种情况下,模式匹配并不是真正必要的,您可以选择更简单的方法:
if d = DateTime.MinValue && e = DateTime.MinValue then
0
else
1
一种可能的替代方法是部分活动模式,方法是将部分逻辑移入其中。当匹配所有元组模式时匹配规则,当 return 是 Some
值时匹配部分活动模式。
这里的部分活动模式是 DateTime -> unit option
类型,因为无论如何我们都将忽略 return 值。
let (|IsMinValue|_|) d =
if d = DateTime.MinValue then Some() else None
match startDate, endDate with
| IsMinValue, IsMinValue -> 0
| _ -> 1
我也会使用部分活动模式。但我会向模式添加参数,使其更易于重用。
let (|IsEqual|_|) shouldBe actual =
if actual = shouldBe then Some actual else None
let isMinDate startDate endDate =
match startDate, endDate with
| IsEqual DateTime.MinValue d, IsEqual DateTime.MinValue e -> 1
| _ -> 0