72 votos

¿Qué significa el símbolo "@" significa, en referencia a las listas en Haskell?

Me he encontrado con una pieza de Haskell código similar a este:

ps@(p:pt)

¿Qué hace el @ símbolo significa en este contexto? Me parece que no puede encontrar ninguna información en Google (que lamentablemente es difícil la búsqueda de símbolos en Google), y no puedo encontrar la función en la Antesala de la documentación, así que me imagino que debe ser alguna especie de azúcar sintáctico en su lugar.

100voto

Nathan Sanders Puntos 10641

Sí, es justo azúcar sintáctico, con @ de lectura en voz alta "como". ps@(p:pt) da nombres para

  1. la lista: ps
  2. cabeza de la lista : p
  3. la lista de la cola: pt

Sin la @, tendría que elegir entre (1) o (2):(3).

Esta sintaxis funciona en realidad para cualquier constructor; si usted tiene data Tree a = Tree a [Tree a], a continuación, t@(Tree _ kids) le da acceso tanto al árbol y a sus hijos.

29voto

sth Puntos 91594

La @ Símbolo se utiliza tanto para dar un nombre a un parámetro y que coincida con el parámetro contra un patrón que sigue la @. No es específica para las listas y también puede ser usado con otras estructuras de datos.

Esto es útil si usted quiere "descomponer" un parámetro en sus partes, mientras que todavía necesitan el parámetro como un todo, en algún lugar de su función. Un ejemplo de que este es el caso es el tails de la función de la biblioteca estándar:

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs

4voto

newacct Puntos 42530

Para agregar a lo que las otras personas han dicho, que se llama como los patrones (en ML la sintaxis que se utiliza la palabra clave "como"), y se describen en la sección de la Haskell Informe sobre los patrones.

4voto

Electric Coffee Puntos 1694

Quiero añadir que @ trabaja a todos los niveles, lo que significa que usted puede hacer esto:

let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)

Que va a producir este: ((Just 1, Just 2), Just 1, 1, 2)

Así que, básicamente, es una manera de obligar a un patrón de valor. Esto también significa que funciona con cualquier tipo de patrón, no solo las listas, como se demostró anteriormente. Esto es una cosa muy útil para saber, ya que significa que usted puede utilizar en muchos más casos.

En este caso, a es la totalidad Maybe Tuple, b es sólo el primer Just de la tupla, y c y d son los valores que figuran en la primera y segunda Just de la tupla respectivamente

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X