Сопоставление с образцом (англ. pattern matching) — метод анализа и обработки структур данных в языках программирования, основанный на выполнении определённых инструкций в зависимости от совпадения исследуемого значения с тем или иным образцом, в качестве которого может использоваться константа, предикат, тип данных или иная поддерживаемая языком конструкция.
Как правило, имеется возможность указать более одного образца и связанного с ним действия.
Сопоставление с образцом часто встречается в функциональных языках программирования, таких как языки семейства ML и Haskell, в том числе в виде охранных выражений.
Образцы последовательностей (например, текстовая строка) можно сопоставлять с регулярными выражениями.
Сравнение с точным значением
Простейшим вариантом является сопоставление с константой. В этом случае сопоставление с образцом эквивалентно условному оператору или конструкции «switch» («case») в императивных языках.
Рассмотрим, для примера, вычисление логического отрицания.
В OCaml:
letnegx=matchxwith|false->true|true->false;;Здесь следующие за символом "|" значения являются образцами, а следующие за «->» выражения вычисляются при совпадении аргумента «x» с одним из образцов.
Тот же пример с использованием условного оператора:
letnegx=ifx=falsethentrueelsefalse;;Использование внутренней структуры объекта
Нахождение суммы списка:
letrecsuml=matchlwith|[]->0|x::xs->x+(sumxs);;В этом примере аргумент функции «sum» сопоставляется со значением «пустой список» либо с образцом «голова :: хвост» (где «::» — оператор добавления элемента в начало списка).
В качестве образца может применяться конструктор значения типа:
typeanimal=Dogofstring|Catofstring;;letsayx=matchxwith|Dog(x)->x^"says 'woof'"|Cat(x)->x^"says 'meow'";;Сопоставление со строкой
Языки с развитыми средствами обработки текста, такие как AWK и SNOBOL, поддерживают сопоставление с регулярным выражением.
Пример на AWK, подсчёт количества включений слов «foo» или «bar»:
/foo|bar/{foobar++}END{printfoobar}