Scala (язык программирования)
- 1 year ago
- 0
- 0
Сопоставление с образцом ( англ. 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 }