Сопоставление с образцом

Из Википедии, бесплатной энциклопедии

Сопоставление с образцом (англ. 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 }