Pregunta

En la sección "Programación F #" me encontré con un patrón de coincidencia como éste (he simplificado un poco):

let rec len list = 
  match list with
  | [] -> 0
  | [_] -> 1
  | head :: tail -> 1 + len tail;;

En la práctica, entiendo que el último partido reconoce la cabeza y la cola de la lista. Conceptualmente, no entiendo por qué funciona. Por lo que yo entiendo, es el operador :: contras, que añade un valor de posición de la cabeza de una lista, pero no se parece a mí como que está siendo utilizado como un operador aquí. ¿Debo entender esto como una "sintaxis especial" para las listas, donde :: se interpreta como un operador o un "perfil de compatibilidad" dependiendo del contexto? O puede la misma idea puede extenderse a otros tipos de listas, con otros operadores?

¿Fue útil?

Solución

Además de la respuesta de Brian, hay algunos puntos que vale la pena destacar. La sintaxis h::t puede ser utilizado tanto como un operador y como un patrón:

let l = 1::2::[]                    // As an operator
match l with x::xs -> 1 | [] -> 0   // As a pattern

Esto significa que es una construcción poco especial, ya que otros operadores (por ejemplo +) no pueden ser utilizados como patrones (para la descomposición de la parte posterior resultado a los argumentos del operador) -, obviamente, por +, esto sería ambiguo.

Además, el [_] patrón es interesante, ya que es un ejemplo de patrón anidado. Se compone:

  • _ - Underscore patrón, que coincide con cualquier valor y no se une ningún símbolo
  • [ <pattern> ] - Single-elemento de lista de patrones, que coincide con un listas con elementos individuales y coincide con el elemento de la lista con el <pattern> anidada
  • .

Usted podría también escribir match 1::[] with | [x] -> x que devolver el valor del elemento individual (en este caso 1).

Otros consejos

Es una sintaxis especial para las listas. Se puede pensar en el tipo list como una unión discriminada de esta manera:

type list<'T> =         // '
    | Nil
    | Cons of 'T * list<'T>

excepto que hay una sintaxis especial que hace que sean Nil [] y Cons(h,t) ser h::t. Entonces es sólo coincidencia de patrones normales de una unión discriminada. ¿Le ayuda?

(ver Posiblemente también esta entrada del blog .)

Se utiliza como un formateador o formalmente pattern, `lista' está adaptada a los tres patrones:

[] significa la lista está vacía

[_] significa que la lista tiene un elemento, ya que no se preocupan por lo que el elemento es, por lo que sólo tiene que poner _ allí, también se puede utilizar [a].

medios :: cabeza de la cola que la lista tiene dos partes: una cabeza y una cola.

Puede ver F # coincidencia de patrones como un poderoso si a continuación, la estructura más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top