Hay otras buenas respuestas, así que le daré una respuesta muy técnica. La concordancia de patrones es la eliminación construir para tipos de datos algebraicos:
"Eliminación construir" significa "cómo consumir o utilizar un valor de"
"Algebraic tipo de datos", además de funciones de primera clase, es la gran idea en un lenguaje funcional de tipos estáticos como Limpio, F #, Haskell o ML
la idea de los tipos de datos algebraicos se que defines un tipo de cosa, y dices todas las formas en que puedes hacer esa cosa. A modo de ejemplo, vamos a definir "Secuencia de cadena" como un tipo de datos algebraica, con tres formas de hacerlo:
data StringSeq = Empty -- the empty sequence
| Cat StringSeq StringSeq -- two sequences in succession
| Single String -- a sequence holding a single element
Ahora, hay todo tipo de cosas mal con esta definición, pero como ejemplo es interesante porque proporciona una concatenación de tiempo constante de secuencias de longitud arbitraria. (Hay otras formas de lograr esto.) La declaración introduce Empty
, Cat
y Single
, que son todas las formas que hay de realizando las secuencias. (Eso hace que cada uno de ellos una introducción — construir una manera de hacer las cosas.)
- que pueda tomar una secuencia vacía y sin ningún otro valor.
- Para hacer una secuencia con
Cat
, necesita otras dos secuencias.
- Para hacer una secuencia con
Single
, necesita un elemento (en este caso una cadena)
Aquí viene el chiste: la construcción de la eliminación, la coincidencia de patrones, le da una manera de examinar una secuencia y pedir es la pregunta ¿con qué constructor se hizo?. Como debe estar preparado para cualquier respuesta, proporciona al menos una alternativa para cada constructor. He aquí una función de longitud:
slen :: StringSeq -> Int
slen s = case s of Empty -> 0
Cat s s' -> slen s + slen s'
Single _ -> 1
En la base de la lengua, toda la coincidencia de patrones se basa en este case
constructo. Sin embargo, debido a los tipos de datos algebraicos y la coincidencia de patrones son tan importantes para los modismos de la lengua, no hay especial "azúcar sintáctico" para hacer la coincidencia de patrones en el formulario de declaración de una definición de función:
slen Empty = 0
slen (Cat s s') = slen s + slen s'
slen (Single _) = 1
Con este azúcar sintáctica, el cálculo por coincidencia de patrones se parece mucho a la definición por ecuaciones. (El comité Haskell hizo esto a propósito.) Y como puede ver en las otras respuestas, es posible especializar una ecuación o una alternativa en una expresión case
golpeando a un guardia sobre ella. No puedo pensar en un protector plausible para el ejemplo de secuencia, y hay muchos ejemplos en las otras respuestas, así que lo dejo ahí.
Quizás también debería incluir el concepto de coincidencia de patrones en F # también ... –
Las toneladas de idiomas tienen coincidencia de patrones, no solo Haskell y F #. – Joe
Es una característica común de los lenguajes puramente funcionales y restrictivos. Prolog, Erlang y SML, por ejemplo. – outis