共用方式為


搜尋運算式 (F#)

match 運算式會根據運算式與一組模式的比較,提供分支控制。

// Match expression.
match test-expression with
    | pattern1 [ when condition ] -> result-expression1
    | pattern2 [ when condition ] -> result-expression2
    | ...

// Pattern matching function.
function
    | pattern1 [ when condition ] -> result-expression1
    | pattern2 [ when condition ] -> result-expression2
    | ...

備註

模式比對運算式允許根據測試運算式與一組模式比較的複雜分支。在 match 運算式中,test-expression 會依次與每個模式比較,找到符合項目時,則會評估對應的 result-expression 並傳回結果值做為比對運算式的值。

上述語法中所顯示的模式比對函式為立即對引數執行模式比對的 Lambda 運算式。上述語法中的模式比對函式相當於下列程式碼。

fun arg ->

match arg with

| pattern1 [ when condition ] -> result-expression1

| pattern2 [ when condition ]-> result-expression2

| ...

如需 Lambda 運算式的詳細資訊,請參閱 Lambda 運算式:fun 關鍵字 (F#)

一組完整的模式應該涵蓋輸入變數的所有可能符合項目。您通常會使用萬用字元模式 (_) 做為最後一個模式,以符合任何先前未對應的輸入值。

在下列程式碼中,會示範 match 運算式的一些用法。如需所有可能模式的參考和範例,請參閱模式比對 (F#)

let list1 = [ 1; 5; 100; 450; 788 ]

// Pattern matching by using the cons pattern and a list
// pattern that tests for an empty list.
let rec printList listx =
    match listx with
    | head :: tail -> printf "%d " head; printList tail
    | [] -> printfn ""

printList list1

// Pattern matching with multiple alternatives on the same line.  
let filter123 x =
    match x with
    | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
    | a -> printfn "%d" a

// The same function written with the pattern matching
// function syntax.
let filterNumbers =
    function | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
             | a -> printfn "%d" a

模式上的成立條件

您可以使用 when 子句來指定變數必須滿足以符合模式的額外條件。這類子句稱為「成立條件」(Guard)。除非有項目符合與該成立條件關聯的模式,否則不會評估 when 關鍵字後面的運算式。

下列範例示範如何使用成立條件,指定變數模式的數值範圍。請注意,多個條件是透過布林運算子結合。

let rangeTest testValue mid size =
    match testValue with
    | var1 when var1 >= mid - size/2 && var1 <= mid + size/2 -> printfn "The test value is in range."
    | _ -> printfn "The test value is out of range."

rangeTest 10 20 5
rangeTest 10 20 10
rangeTest 10 20 40

請注意,因為模式中不可使用常值以外的值,如果輸入的一部分必須與值比對,則必須使用 when 子句。請參考下列程式碼中的示範。

// This example uses patterns that have when guards.
let detectValue point target =
    match point with
    | (a, b) when a = target && b = target -> printfn "Both values match target %d." target
    | (a, b) when a = target -> printfn "First value matched target in (%d, %d)" target b
    | (a, b) when b = target -> printfn "Second value matched target in (%d, %d)" a target
    | _ -> printfn "Neither value matches target."
detectValue (0, 0) 0
detectValue (1, 0) 0
detectValue (0, 10) 0
detectValue (10, 15) 0

請參閱

參考

作用中的模式 (F#)

其他資源

F# 語言參考