軌道
/
F#
F#
/
課程大綱
/
模式配對
模式

模式配對 在 F#

1 個練習

關於 模式配對

if/elif/else運算式可以用來依條件執行程式邏輯。F# 還提供了另一種更強大的方式來依條件執行程式邏輯:模式比對。有了模式比對,就能把一個值拿去和一或多個_模式_比對。_常數模式_就是其中一例,它會把值與常數(例如1或"hello")比對。

在 F# 裡,模式比對是透過match關鍵字完成的:

let describe number =
    match number with
    | 0 -> "Zero"
    | 1 -> "One"

雖然這看起來像其他語言裡的switch敘述,但模式比對要搭配其他模式使用時,才真正展現它的威力。_變數模式_就是其中一種,它可以把值擷取下來:

match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i

有時候,你可能想為模式加上額外的條件。這稱為_防護_(子句),可以用when關鍵字加上去:

match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"

防護子句可以是任何合法的運算式,包括呼叫函式。

在上面的例子中,並非每個可能的輸入都能找到相符的模式。編譯器會偵測到這點並發出警告。這稱為_窮舉比對_。要解決這個警告,就必須處理所有情況。為此可以使用_萬用字元模式_,它會比對任何值:

match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"

// No compiler warning

請注意,編譯器無法用when子句推斷是否窮舉:

match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"

// Compiler warning

模式比對會由上而下逐一測試每個模式,直到找到相符的模式,並執行該模式對應的邏輯。模式的順序很重要!因此,捨棄模式應該永遠放在match運算式的最後。

雖然模式比對非常強大,但簡單的條件邏輯通常用if/else運算式表達會更清楚:

let usingPatternMatching number =
    match number with
    | 0 -> "Zero"
    | _ -> "Non-zero"

let usingIfElse number = if number = 0 then "Zero" else "Non-zero"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 模式配對