完整和部分活动模式

有两种类型的活动模式在使用上有所不同 - 完全模式和部分模式。

当你能够枚举所有结果时,可以使用完整的活动模式,例如“数字是奇数还是偶数?”

let (|Odd|Even|) number = 
  if number % 2 = 0
  then Even
  else Odd

请注意,活动模式定义列出了两种可能的情况,而没有其他情况,并且正文返回列出的一种情况。在匹配表达式中使用它时,这是完全匹配:

let n = 13
match n with
| Odd -> printf "%i is odd" n
| Even -> printf "%i is even" n

当你想要将输入空间分解为完全覆盖它的已知类别时,这很方便。

另一方面,部分活动模式允许你通过返回 option 显式忽略一些可能的结果。他们的定义使用 _ 的特殊情况来表示无与伦比的情况。

let (|Integer|_|) str =
  match Int32.TryParse(str) with
  | (true, i) -> Some i
  | _ -> None

这样我们就可以匹配,即使我们的解析函数无法处理某些情况。

let s = "13"
match s with
| Integer i -> "%i was successfully parsed!" i
| _ -> "%s is not an int" s

部分活动模式可用作测试形式,无论输入是否属于输入空间中的特定类别,而忽略其他选项。