Зіставляння зі взірцем

метод аналізу та опрацювання структур даних у мовах програмування

Зіставляння зі взірцем (англ. 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 }