模式匹配檢查覆蓋整個域

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#編譯器應該給我們一個警告並提示我們重構我們的匹配表示式以讓該人尋求醫療照顧。相反,匹配表示式默默地將無意識的人視為只是醉酒。關鍵是你應該選擇在可能的情況下明確列出案例以避免邏輯錯誤。