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

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая 88.81.43.111 (обсуждение) в 00:52, 29 июня 2015. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

В языках программирования, сопоставление с образцом (англ. 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 }

См. также