Поделиться через


Выражения match (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, а полученное значение возвращается в качестве значения выражения match.

Функция сопоставления шаблонов, продемонстрированная в предыдущей синтаксической конструкции, представляет собой лямбда-выражение, в котором сопоставление шаблонов выполняется непосредственно в аргументе. Функция сопоставления шаблонов, продемонстрированная в предыдущей синтаксической конструкции, эквивалентна следующему.

arg функции ->

сопоставить arg с

| pattern1 [ если condition ] -> result-expression1

| pattern2 [ если condition ]-> result-expression2

| ...

Дополнительные сведения о лямбда-выражениях см. в разделе Лямбда-выражения: ключевое слово 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. Такое предложение называется условие. Выражение, следующее за ключевым словом 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#