Зіставляння із взірцем або зіставлення із шаблоном (англ. pattern matching) — метод аналізу та опрацювання структур даних у мовах програмування, заснований на виконанні певних інструкцій залежно від збігу досліджуваного значення з тим чи іншим взірцем (шаблоном), яким може бути константа, предикат, тип даних або інша конструкція, підтримувана мовою.
Зазвичай є можливість задати більше одного взірця та пов'язаної з ним дії.
Зіставляння із взірцем часто зустрічається у функційних мовах програмування, наприклад, мовах сімейства ML та Haskell, зокрема у вигляді вартових виразів.
Зразки послідовностей (наприклад, текстовий рядок) можна зіставляти з регулярними виразами.
Порівняння з точним значенням ред.
Найпростішим варіантом є зіставляння з константою. У цьому разі зіставляння із взірцем еквівалентне умовному оператору або конструкції switch
(case
) в імперативних мовах.
Розглянемо, наприклад, обчислення логічного заперечення.
В OCaml :
let neg x = match x with | false -> true | true -> false ;;
Тут значення після символа |
є взірцями, а вирази після ->
обчислюються в разі збігу аргументу x
з одним із взірців. Той самий приклад з використанням умовного оператора:
let neg x = if x = false then true else false ;;
Використання внутрішньої структури об'єкта ред.
Обчислення суми списку:
let rec sum l = match l with | [] -> 0 | x :: xs -> x + (sum xs) ;;
У цьому прикладі аргумент функції sum
зіставляється зі значенням «порожній список» або із взірцем «голова :: хвіст» (де ::
— оператор додавання елемента на початок списку).
Алгебричні типи даних ред.
Як взірець може застосовуватися конструктор значення типу:
type animal = Dog of string | Cat of string ;; let say x = match x with | Dog (x) -> x ^ "says 'woof'" | Cat (x) -> x ^ "says 'meow'" ;;
Зіставляння з рядком ред.
Мови з розвиненими засобами опрацювання тексту, такі як AWK та SNOBOL, підтримують зіставляння з регулярним виразом.
Приклад на AWK — підрахунок кількості входжень слів foo або bar:
/foo|bar/ { foobar++ } END { print foobar }
В іншому мовному розділі є повніша стаття Pattern matching(англ.). Ви можете допомогти, розширивши поточну статтю за допомогою перекладу з англійської.
|