В функциональном языке сопоставление с образцом включает проверку аргумента в отношении различных форм. Простой пример включает в себя рекурсивно определенные операции над списками. Я буду использовать OCaml для объяснения сопоставления с образцом, так как это мой функциональный язык выбора, но концепции одинаковы в F # и Haskell, AFAIK.
Вот определение функции для вычисления длины списка lst
. В OCaml `` список is defined recursively as the empty list
[] , or the structure
h :: t , where
h is an element of type
a (
a being any type we want, such as an integer or even another list),
t is a list (hence the recursive definition), and
:: `является оператором cons, который создает новый список из элемента и список.
Итак, функция будет выглядеть так:
let rec len lst =
match lst with
[] -> 0
| h :: t -> 1 + len t
rec
- это модификатор, который сообщает OCaml, что функция будет вызывать себя рекурсивно. Не беспокойся об этой части. Заявление match
- это то, на чем мы сосредоточены. OCaml проверит lst
по двум шаблонам - пустому списку или h :: t
- и на основании этого выдаст другое значение. Поскольку мы знаем, что каждый список будет соответствовать одному из этих шаблонов, мы можем быть уверены, что наша функция вернется безопасно.
Обратите внимание, что хотя эти два шаблона будут заботиться обо всех списках, вы ими не ограничены. Шаблон типа h1 :: h2 :: t
(соответствует всем спискам длиной 2 или более) также действителен.
Конечно, использование шаблонов не ограничивается рекурсивно определенными структурами данных или рекурсивными функциями. Вот (придуманная) функция, которая сообщает вам, является ли число 1 или 2:
let is_one_or_two num =
match num with
1 -> true
| 2 -> true
| _ -> false
В этом случае формами нашего шаблона являются сами числа. _
- это специальный универсальный метод, используемый в качестве случая по умолчанию, если ни один из вышеприведенных шаблонов не совпадает.