Есть и другие хорошие ответы, поэтому я дам вам очень технический ответ. Соответствие шаблонов - это конструкция исключения для алгебраических типов данных :
Идея алгебраических типов данных заключается в том, что вы определяете тип вещи, и вы говорите все способы, которыми вы можете это сделать. В качестве примера давайте определим «Последовательность String» как тип алгебраических данных с тремя способами:
data StringSeq = Empty -- the empty sequence
| Cat StringSeq StringSeq -- two sequences in succession
| Single String -- a sequence holding a single element
Теперь, с этим определением есть все, что не так, но как Например, это интересно, потому что оно обеспечивает конкатенацию последовательностей произвольной длины в постоянное время. (Есть и другие способы достижения этого.) В декларации представлены Empty
, Cat
и Single
, все из которых существуют , создающие последовательности . (Это делает каждый из них введение construct & mdash; способ сделать вещи.)
Cat
, вам понадобятся две другие последовательности. Single
, вам нужен элемент (в этом случае строка) Здесь идет строка перфорации: конструкция исключения, сопоставление шаблонов, дает вам способ тщательно изучить последовательность и задать вопрос о том, какой конструктор вы создали? Поскольку вы должны быть готовы к любому ответу, вы предоставляете по крайней мере одну альтернативу для каждого конструктора. Вот функция длины:
slen :: StringSeq -> Int
slen s = case s of Empty -> 0
Cat s s' -> slen s + slen s'
Single _ -> 1
В основе языка все шаблонные сопоставления построены на этой конструкции case
. Однако, поскольку алгебраические типы данных и сопоставление образцов настолько важны для идиом языка, существует специальный «синтаксический сахар» для выполнения сопоставления шаблонов в форме объявления определения функции:
slen Empty = 0
slen (Cat s s') = slen s + slen s'
slen (Single _) = 1
С помощью этого синтаксический сахар, вычисление путем сопоставления шаблонов во многом напоминает определение уравнениями. (Комитет Haskell сделал это специально.) И, как вы можете видеть в других ответах, можно выделить либо уравнение, либо альтернативу в выражении case
, похлопывая охрану с ним. Я не могу придумать правдоподобного стража для примера последовательности, и в других ответах есть много примеров, поэтому я оставлю его там.