Паттерны массивов/списков (list pattern) позволяют сопоставлять выражения со списками и массивами.
Полное совпадение с массивом/списком:
let getNumber values = match values with | [|1; 2; 3; 4|] -> 4 | [|1; 2; 3|] -> 3 | [|1; 2|] -> 2 | [|1|] -> 1 | _ -> 0 printfn "%d" (getNumber [|1; 2; 3; 4|]) // 4 printfn "%d" (getNumber [|1; 2; 3|]) // 3 printfn "%d" (getNumber [|1; 2|]) // 2 printfn "%d" (getNumber [|1|]) // 1 printfn "%d" (getNumber [|1; 2; 5|]) // 0
Аналогично вместо массивов можно применять списки:
let getNumber2 values = match values with | [1; 2; 3; 4] -> 4 | [1; 2; 3] -> 3 | [1; 2] -> 2 | [1] -> 1 | _ -> 0 printfn "%d" (getNumber2 [1; 2; 3; 4]) // 4 printfn "%d" (getNumber2 [1; 2; 3]) // 3 printfn "%d" (getNumber2 [1; 2]) // 2 printfn "%d" (getNumber2 [1]) // 1 printfn "%d" (getNumber2 [1; 2; 5]) // 0
С помощью паттерна _ можно обозначить одиночный элемент, который имеет любое значение. Например, паттерн [2, _, 5]
соответствует любому массиву из трех элементов, в котором между 2 и 5 располагается произвольное значение. А массив [_, _]
соответствует любому массиву из двух произвольных элементов
Несколько примеров:
let getNumber values = match values with | [2; _; 5] -> 1 | [2; _; _] -> 2 | [_; _; 5] -> 3 | [_; _; _] -> 4 | _ -> 5 printfn "%d" (getNumber [ 2; 3; 5]) // 1 printfn "%d" (getNumber [ 2; 4; 6 ]) // 2 printfn "%d" (getNumber [ 1; 2; 5 ]) // 3 printfn "%d" (getNumber [ 1; 2; 3]) // 4 printfn "%d" (getNumber []); // 5
Отдельные значения массива/списка можно получить в переменные, например:
let printNumbers values = match values with | [first; second; _; last] -> (printfn "first: %d; second: %d; last: %d" first second last) | _ -> () // произвольное количество элементов printNumbers [ 2; 3; 4; 5 ] // first: 2; second: 3; last: 5
В данном случае получаем первый элемент массива в переменную first, второй элемент - в переменную second, а последний элемент - в переменную last.