模式匹配检查覆盖整个域

let x = true
match x with
| true -> printfn "x is true"

产生警告

C:\ Program Files(x86)\ Microsoft VS Code \ Untitled-1(2,7):警告 FS0025:此表达式上的不完整模式匹配。例如,值 false 可以指示模式未涵盖的情况。

这是因为并未涵盖所有可能的 bool 值。

bools 可以明确列出但是 int 更难列出

let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"

这里我们使用特殊的 _ 字符。_ 匹配所有其他可能的情况。

_ 会让你陷入困境

考虑我们自己创建的类型,它看起来像这样

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk

我们可能会写一个看起来像这样的探险赛

match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"

上面的代码是有道理的。我们假设如果你不清醒,你应该调用我们,所以我们用 _ 来表示

我们稍后将代码重构为此

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk
    | Unconscious

F#编译器应该给我们一个警告并提示我们重构我们的匹配表达式以让该人寻求医疗照顾。相反,匹配表达式默默地将无意识的人视为只是醉酒。关键是你应该选择在可能的情况下明确列出案例以避免逻辑错误。