Есть и другие хорошие ответы, поэтому я дам вам очень технический ответ. Сопоставление с образцом является устранения построить для алгебраических типов данных:
«Устранение построить» означает «как потреблять или использовать значение»
«алгебраический тип данных», в дополнении к функции первого класса, является большой идея в статический типизированном функциональном языке как Clean, F #, Haskell или ML
идея алгебраических типов данных что вы определяете тип вещи, и вы говорите все способы, которыми вы можете это сделать. В качестве примера, давайте определим «Последовательность строки» в виде алгебраического типа данных, с тремя способами, чтобы сделать это:
data StringSeq = Empty -- the empty sequence
| Cat StringSeq StringSeq -- two sequences in succession
| Single String -- a sequence holding a single element
Теперь, есть все виды вещей неправильно с этим определением, но в качестве примера интересно потому что он обеспечивает конкатенацию последовательностей произвольной длины в постоянное время. (Есть другие способы добиться этого.) В декларации представлены Empty
, Cat
и Single
, которые являются следующими способами: последовательности выполнения. (Это делает каждый введение построить — способ сделать вещи.)
- Вы можете сделать пустую последовательность без каких-либо других значений.
- Чтобы сделать последовательность с
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
, похлопывая по нему охрану. Я не могу придумать правдоподобного стража для примера последовательности, и в других ответах есть много примеров, поэтому я оставлю его там.
Возможно, также следует включить концепцию соответствия шаблонов в F # ... – 2010-02-08 23:55:23
Тонны языков имеют соответствие шаблонов, а не только Haskell и F #. – Joe
Это общая черта чисто функциональных и ограничений языков. Например, Prolog, Erlang и SML. – outis