En "Programación F #" me encontré con un patrón de coincidencia como éste (he simplificado un poco):entendimiento de coincidencia de patrones con el operador contras
let rec len list =
match list with
| [] -> 0
| [_] -> 1
| head :: tail -> 1 + len tail;;
Prácticamente, entiendo que el último partido reconoce la cabeza y cola de la lista. Conceptualmente, no entiendo por qué funciona. Por lo que entiendo, :: es el operador contras, que añade un valor en la posición de la cabeza de una lista, pero no me parece que se esté utilizando como operador aquí. ¿Debería entender esto como una "sintaxis especial" para las listas, donde :: se interpreta como un operador o un "patrón de coincidencia" según el contexto? ¿O se puede extender la misma idea para otros tipos de listas, con otros operadores?
Gracias, tu punto acerca de :: ser una construcción especial es exactamente lo que no estaba claro. Experimenté intentando usar otros operadores en la coincidencia de patrones de la "misma" manera, pero no tenía mucho sentido y no llegué a ninguna parte, que es lo que me hizo preguntarme sobre las desventajas. – Mathias
Tenga en cuenta que lo mismo es cierto para Tuples: puede usar el patrón (,) para compilar y combinar/desempaquetar tuplas, y para otros tipos también (Some()/None) etc. – Benjol
Aquí hay una lista de [all supported tipos de patrones] (https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/pattern-matching) con ejemplos. – JanDotNet