tuplas - ¿Qué significa el símbolo "@" en referencia a las listas en Haskell?
haskell basico (4)
El símbolo @
se usa para dar un nombre a un parámetro y hacer coincidir ese parámetro con un patrón que sigue al @
. No es específico de las listas y también se puede usar con otras estructuras de datos.
Esto es útil si quiere "descomponer" un parámetro en sus partes mientras todavía necesita el parámetro como un todo en algún lugar de su función. Un ejemplo donde este es el caso es la función de tails
de la biblioteca estándar:
tails :: [a] -> [[a]]
tails [] = [[]]
tails xxs@(_:xs) = xxs : tails xs
Me he encontrado con un trozo de código Haskell que se ve así:
ps@(p:pt)
¿Qué significa el símbolo @
en este contexto? Parece que no puedo encontrar información en Google (desafortunadamente es difícil buscar símbolos en Google), y no puedo encontrar la función en la documentación de Prelude, así que me imagino que debe ser algún tipo de azúcar sintáctico.
Para agregar a lo que las otras personas han dicho, se les llama as-patterns (en ML la sintaxis usa la palabra clave "como"), y se describen en la sección del Informe Haskell sobre patterns .
Quiero agregar que @
funciona en todos los niveles, lo que significa que puedes hacer esto:
let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)
Que luego producirá esto: ((Just 1, Just 2), Just 1, 1, 2)
Entonces, básicamente, es una forma de vincular un patrón a un valor. Esto también significa que funciona con cualquier tipo de patrón, no solo listas, como se demostró anteriormente. Esto es algo muy útil de saber, ya que significa que puede usarlo en muchos más casos.
En este caso, a
es la totalidad de Maybe Tuple
, b
es solo la primera Just
in the tuple, y c
y d
son los valores que figuran en la primera y segunda Just
in the tuple respectivamente
Sí, es solo azúcar sintáctico, con @
leer en voz alta como "como". ps@(p:pt)
le da nombres para
- la lista:
ps
- la cabeza de la lista:
p
- la cola de la lista:
pt
Sin el @
, tendrías que elegir entre (1) o (2) :( 3).
Esta sintaxis en realidad funciona para cualquier constructor; si tiene data Tree a = Tree a [Tree a]
, entonces t@(Tree _ kids)
le da acceso tanto al árbol como a sus hijos.