模式匹配多个日期

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